从 LangSmith
平台记录的运行流程,可以很清晰看到这个检索器会先调用大语言模型生成 3 条与原始问题相关的 子问题,然后再逐个使用传递的检索器检索 3 个子问题,得到对应的文档列表,最后再将所有文档列表进行合并去重,得到最终的文档。
在 MultiQueryRetriever
这个检索器中,预设了一段 prompt
,用于将原始问题生成 3 个关联子问题,并使用 \n
分割得到具体问题。
这段 prompt
如下:
# langchain/retrievers/multi_query.py
DEFAULT_QUERY_PROMPT = PromptTemplate(
input_variables=["question"],
template="""You are an AI language model assistant. Your task is to generate 3 different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""",
)
在 LangChain
中,所有预设的 prompt
绝大部分场景都是使用 OpenAI
的大语言模型进行调试的,所以效果会比较好,对于其他的模型,例如国内的模型,一般来说还需要将对应的提示换成 中文语言,所以可以考虑使用 ChatGPT
翻译原有的 prompt
,更新后:
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=retriever,
llm=ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0),
prompt=ChatPromptTemplate.from_template(
"你是一个AI语言模型助手。你的任务是生成给定用户问题的3个不同版本,以从向量数据库中检索相关文档。"
"通过提供用户问题的多个视角,你的目标是帮助用户克服基于距离的相似性搜索的一些限制。"
"请用换行符分隔这些替代问题。"
"原始问题:{question}"
)
)
基于中文 prompt
生成的问题列表如下:
1. LLMOps应用配置的文档有哪些资源可供参考?
2. 我可以在哪里找到关于LLMOps应用配置的文档?
3. 有哪些文档可以帮助我了解LLMOps应用配置的相关信息?
资料推荐
- 💡大模型中转API推荐
- ✨中转使用教程
- ✨模型优惠查询
对于该检索器,不同的模型生成的query
格式可能并不一样,某些模型生成的多条query
可能并不是按照\n
进行分割,这个时候查询的效果可能不如原始问题,所以在使用该检索器时,一定要多次测试prompt
的效果,或者设置inclued_original
为True
,确保生成内容不符合规范时,仍然可以使用原始问题进行检索。
另外,在 MultiQueryRetriever
的底层进行合并去重时,并没有任何特别的,仅仅只做了循环遍历并记录唯一的文档而已,核心代码:
# langchain/retrievers/multi_query.py
def _unique_documents(documents: Sequence[Document]) -> List[Document]:
return [doc for i, doc in enumerate(documents) if doc not in documents[:i]]
多查询策略是最基础+最简单的 RAG
优化,不涉及到复杂的逻辑与算法,会稍微影响单次对话的耗时。
并且由于需要转换 query
一般较小,以及生成 sub-queries
时对 LLM
的能力要求并不高,在实际的 LLM
应用开发中,通常使用参数较小的本地模型+针对性优化的 prompt
即可完成任务。
而且为了减少模型的幻觉以及胡说八道,一般都将 temperature
设置为 0,确保生成的文本更加有确定性。
资料推荐