如何优化基于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
相关产品推荐
相关产品推荐

