RAG链Prompt注入:传入完整Document还是仅page_content?
解决LangChain RAG链中Document对象注入Prompt的问题
问题原因
LangChain的向量数据库检索器(比如FAISS的as_retriever())默认返回Document对象列表,而非纯文本内容。直接将检索结果传入Prompt时,Python会自动调用Document对象的__str__方法,生成[Document(page_content='...')]格式的字符串,这类冗余格式会成为模型的无效噪声,确实可能干扰输出结果的准确性。
解决方案:提取Document的page_content
只需在检索器后添加一个处理步骤,提取每个Document对象的page_content字段,拼接成模型易读的文本格式即可。可以通过RunnableLambda实现该转换逻辑。
修改后的完整代码
from operator import itemgetter from langchain_community.vectorstores import FAISS from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableLambda, RunnablePassthrough from langchain_openai import ChatOpenAI, OpenAIEmbeddings vectorstore = FAISS.from_texts( ["harrison worked at kensho", "harrison worked for 3 years"], embedding=OpenAIEmbeddings() ) retriever = vectorstore.as_retriever() template = """Answer the question based only on the following context: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) model = ChatOpenAI() # 新增处理逻辑:提取每个文档的page_content并换行拼接 format_docs = RunnableLambda(lambda docs: "\n".join([doc.page_content for doc in docs])) chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() # 可选:添加后直接得到字符串格式的回答 ) # 执行调用 result = chain.invoke("where did harrison work?") print(result)
执行输出示例
处理后的Prompt内容会变成纯文本格式:
ChatPromptValue(messages=[HumanMessage(content="Answer the question based only on the following context: harrison worked for 3 years harrison worked at kensho Question: where did harrison work? ")])
如果添加了StrOutputParser(),最终会直接得到模型的回答:
Harrison worked at Kensho.
补充说明
- 除了
RunnableLambda,也可以使用LangChain内置的format_documents工具函数实现相同效果,代码逻辑更简洁。 - 用换行符拼接多个文档的内容,能让模型更清晰地区分不同上下文片段,进一步提升回答质量。
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

