使用Langchain+Pinecone生成答案耗时1分钟,求原因及优化方案
优化Langchain+Pinecone问答速度的核心方案
核心问题定位
你的代码每次调用都重复执行Pinecone初始化、文档重新嵌入入库操作,再加上map_reduce链的多轮LLM调用,这是耗时长达一分钟的根本原因。以下是针对性优化措施:
提前完成Pinecone索引初始化与文档入库
原代码中pinecone.init()和Pinecone.from_texts()每次请求都执行一次,这是最大的性能瓶颈。生产环境下,这两步应该离线完成:服务启动时仅初始化一次Pinecone客户端,文档嵌入入库也只做一次,而非每次请求重复导入。复用Pinecone客户端与LLM实例
把初始化逻辑移到函数外部,避免重复创建连接和实例:# 全局初始化(服务启动时执行一次) pinecone.init(api_key=os.environ.get('PINECONE_API_KEY_REVENUED'), environment=os.environ.get('PINECONE_ENVIRONMENT')) llm = OpenAI(temperature=0, openai_api_key=openai.api_key) # 从已存在的索引加载,无需重复导入文档 docsearch = Pinecone.from_existing_index(index_name=os.environ.get('index_name'), embedding=embeddings) def answer_with_pinecone(query): # 限制返回文档数量,减少LLM处理压力 docs = docsearch.similarity_search(query, k=3) # 替换为更快的stuff链(文档总长度不超LLM上下文时优先使用) chain = load_qa_chain(llm, chain_type="stuff") answer = chain.run(input_documents=docs, question=query).lstrip() return answer替换更高效的QA链类型
map_reduce需要对每个文档单独调用LLM生成中间结果再汇总,耗时远高于stuff链(直接把所有文档塞进上下文生成答案)。如果单条查询返回的文档总长度不超过LLM上下文窗口(如GPT-3.5的4k/16k tokens),优先用stuff链;若文档过长,可改用refine链或进一步限制返回的文档数量。优化相似性检索的返回数量
通过similarity_search的k参数,在保证答案准确性的前提下,将返回文档数减少到2-3条,直接降低LLM需要处理的文本量。添加查询缓存
对重复查询做本地缓存,避免重复调用Pinecone和LLM,进一步缩短响应时间。
内容的提问来源于stack exchange,提问作者Yishai Rasowsky
相关产品推荐
相关产品推荐

