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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:32:57