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

如何让LangChain的ConversationalRetrievalChain携带Chromadb元数据至Prompt

解决ConversationalRetrievalChain中LLM无法获取文档元数据的问题

要让LLM同时获取文档的page_content和关联的filename、candidatename元数据,有两种直接可行的方案:

方案一:入库前将元数据嵌入文档内容

在将PDF文档存入向量库前,手动把元数据(候选人姓名、简历文件名)追加到文档内容的开头或结尾,这样检索返回的内容本身就包含元数据,LLM自然能读取到。

示例代码:

# 加载PDF文档后,遍历处理每个文档
for doc in docs:
    # 将元数据插入到内容头部
    doc.page_content = f"候选人姓名:{doc.metadata['candidatename']}\n简历文件名:{doc.metadata['filename']}\n\n{doc.page_content}"

# 处理完成后,再将docs存入vectorstore
vectorstore.add_documents(docs)

方案二:自定义文档格式化模板

通过修改ConversationalRetrievalChain的文档组合逻辑,让每个文档在传给LLM前自动带上元数据信息。

示例代码:

from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate, DocumentPromptTemplate

# 定义单个文档的输出模板,包含元数据字段
document_prompt = DocumentPromptTemplate(
    input_variables=["page_content", "metadata"],
    template="候选人姓名:{metadata.candidatename}\n简历文件名:{metadata.filename}\n\n{page_content}"
)

# 定义LLM的回答提示模板
combine_prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="根据以下简历信息回答问题:\n\n{context}\n\n问题:{question}\n回答:"
)

# 创建文档组合链
llm_chain = LLMChain(llm=llm, prompt=combine_prompt)
combine_docs_chain = StuffDocumentsChain(
    llm_chain=llm_chain,
    document_variable_name="context",
    document_prompt=document_prompt
)

# 初始化ConversationalRetrievalChain时传入自定义的组合链
conversation_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=SelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info),
    memory=memory,
    verbose=True,
    combine_docs_chain=combine_docs_chain
)

这两种方案都能确保LLM在生成回答时,同时获取到文档内容和对应的元数据信息。方案一适合提前预处理文档,方案二更灵活,无需修改原始文档内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:47:39