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

如何限制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:48:01