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

如何配置LangChain代码仅基于自有数据回答问题?

问题:如何让LangChain仅基于自有数据回答问题

我用LangChain实现基于自有文本数据的问答,但当前代码在提问自有数据中不存在的内容时,模型仍会调用自身知识库回答。比如提问“What is StackOverflow?”,而我的mydata.txt里没有相关内容,模型依然返回了关于StackOverflow的解释。现在需要实现:仅当自有数据中存在相关信息时才生成回答,否则提示无相关内容。

原代码如下:

from langchain.indexes import VectorstoreIndexCreator
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
import os

# OpenAI
os.environ["OPENAI_API_KEY"] = 'my_key'

loader = TextLoader('mydata.txt')
text = loader.load()

# Index
index = VectorstoreIndexCreator().from_loaders([loader])

query = 'What is StackOverflow?'
results = index.query(query)

print(results)

解决方案

VectorstoreIndexCreator的query方法默认会在没有检索到相关文档时让LLM兜底回答。要实现仅基于自有数据回答,需要拆分检索和生成步骤,先判断是否检索到有效文档,再决定是否调用LLM:

修改后的代码

from langchain.indexes import VectorstoreIndexCreator
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains.question_answering import load_qa_chain
import os

# 配置OpenAI密钥
os.environ["OPENAI_API_KEY"] = 'my_key'

# 加载自有数据并创建索引
loader = TextLoader('mydata.txt')
index_creator = VectorstoreIndexCreator(embedding=OpenAIEmbeddings())
index = index_creator.from_loaders([loader])

# 获取向量存储和LLM链
vectorstore = index.vectorstore
llm = ChatOpenAI(temperature=0)
qa_chain = load_qa_chain(llm, chain_type="stuff")

# 提问
query = 'What is StackOverflow?'

# 1. 先从自有数据中检索相关文档
# 可通过k参数控制返回文档数量,或添加相似度阈值过滤
retrieved_docs = vectorstore.similarity_search(query, k=3)

# 2. 判断是否检索到有效文档
if not retrieved_docs:
    print("没有找到相关信息")
else:
    # 3. 仅用检索到的文档生成回答
    results = qa_chain.run(input_documents=retrieved_docs, question=query)
    print(results)

关键说明

  • 拆分检索与生成:不再直接使用index.query,先调用vectorstore.similarity_search获取相关文档,判断是否存在有效结果。
  • 相似度阈值(可选):如果需要更严格的匹配,可使用similarity_search_with_score方法过滤低相似度文档:
    retrieved_docs_with_scores = vectorstore.similarity_search_with_score(query, k=3)
    # 示例:仅保留相似度高于0.7的文档
    filtered_docs = [doc for doc, score in retrieved_docs_with_scores if score > 0.7]
    if not filtered_docs:
        print("没有找到相关信息")
    else:
        results = qa_chain.run(input_documents=filtered_docs, question=query)
        print(results)
    
  • 约束LLM输出:设置ChatOpenAI(temperature=0),让回答严格贴合检索到的文档内容,减少模型自行发挥的空间。

内容的提问来源于stack exchange,提问作者AdGency PRO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:33:16