如何限制LangChain中的OpenAI仅基于自定义知识库回答问题
如何限制LangChain中的OpenAI仅基于自定义知识库回答问题
嗨,我完全懂你现在的困扰——明明想让LangChain搭配OpenAI构建的聊天机器人只围着你提供的自定义知识库(比如那个站点地图)转,结果它一碰到知识库外的问题(比如美国第16任总统这种),就忍不住动用自己的通用知识来回答,对吧?别着急,我给你几个实用的解决办法,亲测有效:
精准约束提示词(Prompt)
这是最直接的手段,你要明确给模型“划红线”:只能用检索到的知识库内容回答,不知道就直说不知道。比如构造这样的提示模板,把检索到的上下文和用户问题明确绑定,不给模型留“发挥”空间:from langchain.prompts import PromptTemplate prompt_template = """你必须严格使用下面提供的上下文信息回答用户问题,上下文之外的内容一概不能用: {context} 用户问题:{question} 如果上下文里找不到相关内容,请直接回复「我无法回答这个问题,因为它不在我的知识库范围内」,绝对不能使用你自身的通用知识作答。""" PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] )配置RetrievalQA链的关键参数
如果你用的是RetrievalQA链,调整几个参数就能大幅改善情况:- 把
temperature设为0:让模型更“严谨”,减少天马行空的幻觉,只基于给定内容输出; - 传入自定义的提示模板:用上面写的PROMPT替换默认模板;
- 合理设置检索器的
k值:控制返回的相关文档数量,避免无关文档干扰。
示例代码如下:
from langchain.chains import RetrievalQA from langchain.llms import OpenAI qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(temperature=0), chain_type="stuff", retriever=your_vectorstore.as_retriever(k=3), # k值可根据知识库规模调整 chain_type_kwargs={"prompt": PROMPT}, return_source_documents=True )- 把
添加检索结果的相关性校验
有时候检索器可能会返回和问题不相关的文档,这时候可以先做一步校验:计算问题和检索到的文档的相似度,如果相似度低于阈值,直接返回“无法回答”,不用调用LLM。比如用余弦相似度来判断:def check_relevance(question, retrieved_docs, threshold=0.7): from langchain.embeddings import OpenAIEmbeddings from sklearn.metrics.pairwise import cosine_similarity embeddings = OpenAIEmbeddings() question_embedding = embeddings.embed_query(question) doc_embeddings = [embeddings.embed_doc(doc.page_content) for doc in retrieved_docs] # 计算问题和每个文档的相似度 similarities = cosine_similarity([question_embedding], doc_embeddings)[0] # 最高相似度低于阈值则判定为不相关 if max(similarities) < threshold: return False return True # 使用逻辑:先校验再调用链 question = "Who was the sixteenth president of US." retrieved_docs = your_vectorstore.as_retriever(k=3).get_relevant_documents(question) if not check_relevance(question, retrieved_docs): print("我无法回答这个问题,因为它不在我的知识库范围内") else: result = qa_chain({"query": question}) print(result["result"])
一般来说,把前两个方法结合起来就能解决大部分问题,如果追求更严谨的效果,再加上第三个校验步骤就稳了。
备注:内容来源于stack exchange,提问作者Abhishek Sawan
相关产品推荐
相关产品推荐

