如何在LangChain中获取ChatGPT所用的输入文档列表?
提取LangChain中ChatGPT实际使用的输入文档
方法1:自定义QA链提示词,强制返回引用的文档标识
给每个输入文档添加唯一标识(比如doc_id元数据),然后修改load_qa_chain的提示词,要求模型在回答末尾明确标注用到的文档ID。示例代码:
from langchain.prompts import PromptTemplate from langchain.chains.qa_with_sources import load_qa_with_sources_chain from langchain.llms import OpenAI from langchain.schema import Document # 自定义提示词,明确要求标注引用的文档ID prompt_template = """用下面的上下文回答问题,若用到某文档内容,必须在回答末尾以【引用文档:doc_id1, doc_id2】格式标注。 上下文: {summaries} 问题: {question} 回答:""" PROMPT = PromptTemplate( template=prompt_template, input_variables=["summaries", "question"] ) # 加载自定义提示的QA链 chain = load_qa_with_sources_chain( OpenAI(temperature=0), chain_type="stuff", prompt=PROMPT ) # 给输入文档添加唯一doc_id input_docs = [ Document(page_content="文档1内容...", metadata={"doc_id": "doc_001"}), Document(page_content="文档2内容...", metadata={"doc_id": "doc_002"}), Document(page_content="文档3内容...", metadata={"doc_id": "doc_003"}), Document(page_content="文档4内容...", metadata={"doc_id": "doc_004"}) ] # 运行链并获取结果 result = chain({"input_documents": input_docs, "question": "你的问题"}, return_only_outputs=True) print(result['output_text'])
解析回答末尾的标注内容,就能直接得到模型实际使用的文档列表。
方法2:使用带来源追踪的RetrievalQA链
如果文档是通过检索器获取的,直接用RetrievalQAWithSourcesChain,它会自动返回回答对应的来源文档元数据:
from langchain.chains import RetrievalQAWithSourcesChain from langchain.vectorstores import Chroma from langchain.embeddings.openai import OpenAIEmbeddings # 构建向量存储与检索器 vectorstore = Chroma.from_documents(input_docs, OpenAIEmbeddings()) retriever = vectorstore.as_retriever() # 加载带来源的QA链 chain = RetrievalQAWithSourcesChain.from_llm( llm=OpenAI(temperature=0), retriever=retriever ) # 运行并获取结果 result = chain({"question": "你的问题"}) print("回答内容:", result['answer']) print("实际使用的文档:", result['sources'])
sources字段会包含模型参考的文档标识(比如你设置的doc_id或文件路径)。
方法3:语义匹配反向验证
如果前两种方法无法满足需求,可以通过语义匹配判断:
- 对每个输入文档和模型回答分别生成嵌入向量
- 计算回答向量与各文档向量的相似度,相似度高于阈值的文档即为被使用的文档
示例代码(简化版):
from langchain.embeddings.openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() # 生成回答的嵌入 answer_embedding = embeddings.embed_query(result['answer']) # 生成各文档的嵌入并计算相似度 used_docs = [] for doc in input_docs: doc_embedding = embeddings.embed_query(doc.page_content) # 计算余弦相似度(可使用sklearn的cosine_similarity) similarity = cosine_similarity([answer_embedding], [doc_embedding])[0][0] if similarity > 0.7: # 自定义阈值 used_docs.append(doc.metadata['doc_id']) print("推测使用的文档:", used_docs)
内容的提问来源于stack exchange,提问作者Omered
相关产品推荐
相关产品推荐

