LangChain中Chroma文档检索在Flask前端无法正常工作
问题排查与解决方案
核心问题分析
命令行运行正常但Flask调用失效,结合日志推测是Chroma数据库未完成初始化就被调用,或Flask运行环境导致Chroma加载异常(如工作目录不一致、多进程重载冲突)。
具体解决方案
1. 延迟Chat_db初始化,避免全局提前加载
Flask启动时(尤其是开发模式)会提前执行全局代码,可能导致Chroma还未完成持久化数据加载就被调用。改为请求时懒加载:
修改app.py:
## app.py ... chat_db = None def get_chat_db(): global chat_db if chat_db is None: chat_db = Chat_db() return chat_db @app.route('/message', methods=['POST']) def message(): user_message = request.json['message'] if "document" in user_message.lower(): # 仅在需要时初始化Chat_db db_instance = get_chat_db() response = db_instance.chat_over_documents(user_message) return jsonify({"message": response}) else: response = assistant.chat_with_gpt(user_message) return jsonify({"message": response})
2. 关闭Flask开发服务器的重载机制
Flask开发模式默认启用代码重载,会启动两个进程,全局初始化的Chat_db会在子进程中重新加载,可能导致Chroma读取异常。
- 命令行启动时关闭重载:
flask run --no-reload
- 或在代码中设置:
if __name__ == '__main__': app.run(reload=False)
3. 修正Chroma的持久化路径(避免工作目录差异)
命令行和Flask的工作目录可能不同,导致chromadb文件夹指向不同位置,加载空数据库。改为绝对路径:
修改Chat_db类的__init__方法:
import os class Chat_db: def __init__(self): # 使用绝对路径指定持久化目录 persist_directory = os.path.abspath('chromadb') embedding = OpenAIEmbeddings() vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding) # 添加日志验证加载的文档数量 print(f"加载的文档总数: {vectordb._collection.count()}") retriever = vectordb.as_retriever(search_kwargs={"k": 2}) self.qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever= retriever)
4. 验证检索结果,定位问题环节
修改chat_over_documents方法,打印检索到的源文档,确认是否真的从Chroma获取到数据:
def chat_over_documents(self, query): # 开启返回源文档选项 result = self.qa({"query": query, "return_source_documents": True}) print(f"检索到的源文档: {result['source_documents']}") return result['result']
- 如果
source_documents为空:说明Chroma未加载到数据,检查路径或数据库文件完整性。 - 如果有源文档但仍返回默认回复:调整RetrievalQA的链类型或prompt模板,确保LLM能正确使用检索到的内容。
内容的提问来源于stack exchange,提问作者Moibah
相关产品推荐
相关产品推荐

