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

如何正确连接ChromaDB集合与LangChain,调用自有嵌入数据获取结果?

ChromaDB与LangChain连接问题:使用预生成嵌入调用自有数据的解决方案

问题根源

你的代码返回ChatGPT默认回复,核心原因有两点:

  1. Chroma数据存储结构错误:LangChain的Chroma集成期望documents字段存储用于上下文的完整文本内容,而你将title存入documents、实际文本放在metadatas,导致检索时无法获取有效上下文。
  2. 未验证检索结果有效性:若检索器未返回自有数据,LLM会自动使用默认逻辑生成回复。

修正步骤与代码

1. 调整Chroma数据存储映射

将实际文本内容存入documents字段,标题等辅助信息放入metadatas,确保检索时能拿到正确的上下文:

# 修正字段映射逻辑
documents = list(embedded_df['text'].values)  # 存储实际文本内容
metadatas = embedded_df[['title']].to_dict(orient='record')  # 标题作为元数据
embedding_list = list(embedded_df['text_embedding'].values)
idx = [str(i) for i in range(len(embedded_df))]

collection.add(
    documents=documents,
    embeddings=embedding_list,
    metadatas=metadatas,
    ids=idx
)

2. 验证检索结果

在构建QA链前,先确认检索器能返回自有数据,避免因检索为空导致LLM默认回复:

# 测试检索器输出
retrieved_docs = retriver.get_relevant_documents(query)
print("检索到的文档:")
for doc in retrieved_docs:
    print(doc.page_content)

若此处无输出,需排查:

  • 预生成的embedding与查询用的text-embedding-ada-002模型是否一致
  • embedded_df['text_embedding']是否为合法的浮点数组格式

3. 自定义Prompt强制使用上下文

通过自定义Prompt约束LLM必须基于检索到的上下文回答,避免其生成默认内容:

from langchain.prompts import PromptTemplate

prompt_template = """使用以下上下文回答用户问题,不知道答案就直接说明,禁止编造内容。

上下文:
{context}

问题: {question}
回答:"""
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)

# 用自定义Prompt构建QA链
qa = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type='stuff',
    retriever=retriver,
    chain_type_kwargs={"prompt": PROMPT}
)

完整修正代码

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import chromadb

# 初始化Chroma客户端与集合
chroma_client = chromadb.Client()
collection = chroma_client.create_collection(name="Testing")

# 修正数据存储映射
documents = list(embedded_df['text'].values)
metadatas = embedded_df[['title']].to_dict(orient='record')
embedding_list = list(embedded_df['text_embedding'].values)
idx = [str(i) for i in range(len(embedded_df))]

collection.add(
    documents=documents,
    embeddings=embedding_list,
    metadatas=metadatas,
    ids=idx
)

# 初始化嵌入函数(与预生成embedding模型保持一致)
embedding_func = OpenAIEmbeddings(model='text-embedding-ada-002')
langchainChroma = Chroma(client=chroma_client, collection_name='Testing', embedding_function=embedding_func)

# 初始化LLM与检索器
llm = ChatOpenAI()
retriver = langchainChroma.as_retriever(search_kwargs={"k":2})

# 验证检索结果
retrieved_docs = retriver.get_relevant_documents("What is your most favorite food?")
print("检索到的文档:")
for doc in retrieved_docs:
    print(doc.page_content)

# 自定义Prompt构建QA链
prompt_template = """使用以下上下文回答用户问题,不知道答案就直接说明,禁止编造内容。

上下文:
{context}

问题: {question}
回答:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])

qa = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type='stuff',
    retriever=retriver,
    chain_type_kwargs={"prompt": PROMPT}
)

# 执行查询
query = """What is your most favorite food?"""
result = qa.run(query)
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:16:02