You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:47:13