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

如何在ConversationalRetrievalChain回答中嵌入PDF文档元数据标识?

解决Langchain ConversationalRetrievalChain回答中嵌入PDF元数据标识的问题

核心问题在于需要让LLM明确关联检索到的文档内容与对应的元数据,并在回答中主动标注。以下是具体实现步骤:

1. 自定义文档格式化逻辑

将每个检索到的文档内容与元数据(如PDF标识)绑定,让上下文信息自带来源标识,让LLM能直接感知内容对应的文档:

def format_docs_with_metadata(docs):
    formatted_content = []
    for doc in docs:
        # 从元数据中提取PDF标识,这里假设元数据键为"doc_name",可根据实际调整
        doc_id = doc.metadata.get("doc_name", "unlabeled_doc")
        # 将内容与来源拼接
        formatted_doc = f"{doc.page_content}\n(来源:{doc_id})"
        formatted_content.append(formatted_doc)
    return "\n\n".join(formatted_content)

2. 定制Prompt模板

明确告知LLM必须基于带来源的上下文回答,且每个信息点都要标注对应文档标识:

from langchain.prompts import PromptTemplate

custom_prompt = PromptTemplate(
    input_variables=["chat_history", "question", "context"],
    template="""基于以下上下文回答用户问题,**每个具体信息必须标注对应来源的文档标识**:

上下文:
{context}

历史对话记录:
{chat_history}

用户问题:{question}

回答要求:
- 严格基于上下文内容,不得编造信息
- 每个提及的具体数据/信息后,必须标注其来源的文档标识(如:(来源:doc01))
"""
)

3. 重构ConversationalRetrievalChain

将自定义的文档格式化逻辑和Prompt整合到链中:

from langchain.chains import ConversationalRetrievalChain

# 初始化链时传入自定义配置
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=your_llm_instance,  # 替换为你的LLM模型(如GPT-3.5/4、Llama等)
    retriever=your_vector_retriever,  # 替换为你的向量检索器
    # 传入自定义Prompt
    combine_docs_chain_kwargs={"prompt": custom_prompt},
    # 指定文档格式化函数
    document_prompt=PromptTemplate(
        input_variables=["page_content", "metadata"],
        template="{page_content}\n(来源:{metadata['doc_name']})"
    ),
    return_source_documents=True  # 可选,开启后可返回检索到的原始文档,方便调试
)

关键说明

  • 之前仅遍历文档元数据无效的原因:LLM无法直接将孤立的元数据列表与回答内容关联,必须将来源标识与内容绑定后传入上下文,同时通过Prompt强制标注要求。
  • 如果模型标注仍不准确,可在Prompt中添加示例(如:"例如:XXX铝型材(来源:doc01),YYY铝型材(来源:doc02)"),强化模型的格式认知。
  • 确保元数据中的PDF标识(如doc_name)在文档加载时已正确存入,可通过print(doc.metadata)确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:22:36