如何在不指定from_chain_type时为LangChain RetrievalQA使用自定义提示词
LangChain直接加载链时使用自定义提示词的解决方案
背景
LangChain加载检索问答链有两种方式:
- 方式一:通过
RetrievalQA.from_chain_type()快速指定链类型,优点是切换简单,但对链参数的控制灵活性不足 - 方式二:先用
load_qa_chain()加载链,再传入RetrievalQA实例,优点是能更灵活调整链参数,但官方文档未明确说明如何结合自定义提示词使用
两种方式的代码示例:
方式一(快速指定链类型)
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="map_reduce", retriever=docsearch.as_retriever())
方式二(直接加载链)
qa_chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff") qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())
问题描述
方式一中可以通过chain_type_kwargs参数传递自定义提示词,代码可正常运行:
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever(), chain_type_kwargs=chain_type_kwargs)
但尝试给RetrievalQA直接传入chain_type_kwargs时会触发报错:
ValidationError: 1 validation error for RetrievalQA chain_type_kwargs extra fields not permitted (type=value_error.extra)
原因是load_qa_chain和RetrievalQA本身都不支持chain_type_kwargs参数。
解决方案
要在直接加载链的方式中使用自定义提示词,需将提示词参数直接传递给load_qa_chain,而非RetrievalQA。不同链类型对应不同的提示词参数,具体如下:
1. Stuff链示例
先定义自定义提示词,再加载链时传入:
from langchain.prompts import PromptTemplate # 定义自定义提示词 custom_prompt = PromptTemplate( template="请根据以下文档内容回答问题:\n{context}\n问题:{question}\n回答:", input_variables=["context", "question"] ) # 加载链时传入自定义提示词 qa_chain = load_qa_chain( OpenAI(temperature=0), chain_type="stuff", prompt=custom_prompt ) qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())
2. Map-Reduce链示例
该链需要分别传入映射阶段和合并阶段的提示词:
# 定义映射阶段提示词 map_prompt = PromptTemplate( template="请总结以下文档内容,用于回答后续问题:\n{context}\n总结:", input_variables=["context"] ) # 定义合并阶段提示词 combine_prompt = PromptTemplate( template="请根据以下各文档的总结回答问题:\n{summaries}\n问题:{question}\n回答:", input_variables=["summaries", "question"] ) # 加载链时传入对应提示词 qa_chain = load_qa_chain( OpenAI(temperature=0), chain_type="map_reduce", map_prompt=map_prompt, combine_prompt=combine_prompt ) qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())
3. Refine链示例
该链需要传入基础问题提示词和迭代优化提示词:
# 定义基础问题提示词 question_prompt = PromptTemplate( template="请根据以下文档内容回答问题:\n{context}\n问题:{question}\n初步回答:", input_variables=["context", "question"] ) # 定义迭代优化提示词 refine_prompt = PromptTemplate( template="现有一个初步回答:{existing_answer}\n请结合以下新文档内容优化回答:\n{context}\n优化后的回答:", input_variables=["existing_answer", "context"] ) # 加载链时传入对应提示词 qa_chain = load_qa_chain( OpenAI(temperature=0), chain_type="refine", question_prompt=question_prompt, refine_prompt=refine_prompt ) qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())
通过这种方式,既能灵活调整链的参数,又能使用自定义提示词。
内容的提问来源于stack exchange,提问作者Stephen Strosko
相关产品推荐
相关产品推荐

