在Langchain的ConversationalRetrievalChain中能否仅查询本地文档不调用OpenAI数据?
问题解决:ConversationalRetrievalChain仅查询本地文档不引入大模型外部数据
ConversationalRetrievalChain本身设计依赖LLM处理对话逻辑,但可以通过替换LLM为仅返回本地检索内容的自定义模型,实现完全基于本地文档的查询,不引入大模型外部数据。
实现方案
核心思路是创建一个不调用OpenAI接口的自定义LLM类,直接返回检索到的本地文档内容,既满足链对LLM参数的必填要求,又隔绝外部数据。
步骤1:定义本地专属LLM类
from langchain.llms.base import LLM from typing import Optional, List, Any class LocalOnlyLLM(LLM): @property def _llm_type(self) -> str: return "local-only" def _call( self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[Any] = None, ) -> str: # 提取prompt中携带的本地检索上下文并返回 return prompt.split("Context:")[-1].strip() if "Context:" in prompt else prompt
步骤2:用自定义LLM初始化对话链
from langchain.chains import ConversationalRetrievalChain # 假设index已完成本地文档索引构建 retriever = index.vectorstore.as_retriever(search_kwargs={"k": 1}) # 替换OpenAI LLM为自定义的LocalOnlyLLM chain = ConversationalRetrievalChain.from_llm( llm=LocalOnlyLLM(), retriever=retriever, return_source_documents=True # 可选,返回源文档用于验证 ) # 测试查询 chat_history = [] query = "你的具体查询内容" result = chain({"question": query, "chat_history": chat_history}) print(result["answer"])
补充说明
- 自定义LLM的
_call方法可根据ConversationalRetrievalChain的prompt模板调整,确保准确提取本地检索内容。默认prompt会携带检索到的上下文,直接提取即可。 - 若需保留对话历史关联,可在自定义LLM中加入历史内容的拼接处理,确保回答仅基于历史记录+本地文档,不调用外部大模型。
内容的提问来源于stack exchange,提问作者user235128
相关产品推荐
相关产品推荐

