LangChain多上下文获取与向量库结果自动赋值机制问询
问题解答
1. 向量库查询结果自动赋值给{context}的机制
你通过RetrievalQA.from_chain_type创建问答链时,指定的retriever=vectorstore.as_retriever(...)是核心:
- 当调用
qa链(比如qa({"query": "你的问题"}))时,RetrievalQA会自动用传入的query去向量库执行检索,获取匹配度最高的k条文档(这里k=1)。 - 因为你用的是
chain_type="stuff",这个链类型的逻辑会把检索到的文档内容直接填充到PromptTemplate中定义的{context}变量位置,整个过程是LangChain的RetrievalQA组件内部自动完成的,无需手动给context赋值。
2. 传入第二个上下文{context2}的实现方式
可以实现,需根据context2的来源调整代码:
场景1:context2是固定文本/手动传入的静态内容
- 修改prompt模板,加入
{context2}占位符:prompt_template = """ This is a pair of template question and answer. {context} Additional context: {context2} Continue the question by strongly considering the answer from the context. Answer that needs to be continued is below. If a sentence is started, make sure to just continue it: {question} Continuation:""" - 更新PromptTemplate的
input_variables,加入context2:PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "context2", "question"] ) - 调用qa链时直接传入
context2参数:result = qa({"query": "你的问题", "context2": "你的第二个上下文内容"})
场景2:context2是另一个向量库的检索结果
需要额外添加检索器,手动处理双检索逻辑:
- 先初始化第二个向量库的retriever:
vectorstore2 = Chroma( collection_name="另一个集合名", persist_directory="另一个Chroma目录", embedding_function=embedding ) retriever2 = vectorstore2.as_retriever(search_kwargs={"k": 1}) - 手动获取两个检索结果,再传入链中:
注意这种场景下,要去掉RetrievalQA的# 获取两个向量库的检索结果 docs1 = retriever.get_relevant_documents("你的问题") docs2 = retriever2.get_relevant_documents("你的问题") context = "\n".join([doc.page_content for doc in docs1]) context2 = "\n".join([doc.page_content for doc in docs2]) # 调用链时传入双上下文 result = qa({"query": "你的问题", "context": context, "context2": context2})retriever参数,改用普通LLMChain,避免框架自动重复填充context。
内容的提问来源于stack exchange,提问作者Nickpick
相关产品推荐
相关产品推荐

