如何配置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
相关产品推荐
相关产品推荐

