You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化基于Langchain+Chroma的OpenAI聊天机器人NLP处理耗时?

优化建议

1. 避免重复初始化Chain与LLM实例

每次调用ask_docs都重新生成chain会重复触发OpenAI客户端、Chain实例的初始化流程,带来不必要的开销。将Chain初始化逻辑移到函数外部,全局复用实例:

# 全局初始化,仅执行一次
chain = load_qa_with_sources_chain(
    OpenAI(temperature=0, openai_api_key=openai.api_key),
    chain_type="stuff"
)

def ask_docs(relevant_documents, query):
    sourced_answer_obj = chain(
        {"input_documents": [doc[0] for doc in relevant_documents],
         "question": query}, return_only_outputs=True)
    return sourced_answer_obj['output_text'].strip()

2. 替换为更高效的Chain类型

map_reduce是QA Chain中速度最慢的类型,它需要对每篇文档单独生成回答再合并,仅适合超大量文档的场景。生产环境追求速度优先选择:

  • stuff:将所有相关文档一次性塞进Prompt请求LLM,速度最快,适合文档总token数不超过模型上下文窗口的场景(如gpt-3.5-turbo的4k/16k token上限)
  • map_rerank:对单篇文档生成回答并打分,取最高分结果,速度介于stuff与map_reduce之间
  • refine:基于前序回答迭代优化,比map_reduce效率更高

3. 切换到Chat类模型

当前使用的是OpenAI Completion模型(默认text-davinci-003),Chat模型(gpt-3.5-turbo、gpt-3.5-turbo-16k)响应速度更快,成本仅为Completion模型的1/10左右,示例代码:

from langchain.chat_models import ChatOpenAI

chain = load_qa_with_sources_chain(
    ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", openai_api_key=openai.api_key),
    chain_type="stuff"
)

4. 限制检索返回的文档数量

若relevant_documents返回的文档过多(如10篇以上),会导致Prompt过长、LLM处理耗时增加。在Chroma检索时限制返回数量,仅保留最相关的内容:

# 示例:Chroma检索时设置k参数限制返回文档数
relevant_documents = chroma_db.similarity_search(query, k=3)

5. 预处理文档减少冗余

若单篇文档过长,入库前用RecursiveCharacterTextSplitter将文档拆分为合适长度的片段,避免LLM处理冗余内容,同时确保总token数不超过模型上下文窗口。

6. 缓存重复查询结果

对用户重复提问的内容,直接返回缓存结果,避免重复调用LLM。可通过字典或Redis实现:

from functools import lru_cache

# 注意:需将relevant_documents转换为可哈希的键(如文档来源+摘要)
@lru_cache(maxsize=1000)
def cached_ask(query, doc_keys):
    # 执行Chain调用逻辑
    pass

内容的提问来源于stack exchange,提问作者Yishai Rasowsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:33:12