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

如何让ConversationalRetrievalChain角色Bot支持通用事实问答?

问题解决思路与方案

一、核心问题分析

你当前的ConversationalRetrievalChain实现是**基于检索增强生成(RAG)**的模式,核心逻辑是优先从指定文档中检索相关内容,再结合检索结果生成回答。如果文档里没有Finneas的相关信息,模型就无法生成对应通用事实答案——默认配置下它会被限制在检索到的内容范围内输出。另外你设置的chunk_size=30会导致文本切割过于细碎,语义完整性被破坏,进一步降低了检索有效性。

二、具体解决方法

1. 调整RAG逻辑,允许模型补充通用知识

通过自定义Prompt,让模型在检索结果不足时调用自身通用知识库回答。修改代码如下:

from langchain.prompts import PromptTemplate

def handleMessage(message):
    loader = TextLoader("./learning.txt")
    # 优化文本分割参数,保留完整语义
    text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
    documents = text_splitter.split_documents(loader.load())
    embeddings = OpenAIEmbeddings()

    vectorstore = Chroma.from_documents(documents, embeddings)
    llm = OpenAI(temperature=0)
    memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True, output_key="answer")

    # 自定义Prompt,明确允许补充通用知识
    custom_prompt = PromptTemplate(
        input_variables=["chat_history", "question", "context"],
        template="""结合以下上下文、聊天历史回答用户问题:

上下文:
{context}

聊天历史:
{chat_history}

用户问题:{question}

注意:如果上下文没有足够信息支撑回答,可以使用你掌握的通用知识补充内容。"""
    )

    chain = ConversationalRetrievalChain.from_llm(
        llm,
        vectorstore.as_retriever(),
        memory=memory,
        return_source_documents=True,
        verbose=True,
        combine_docs_chain_kwargs={"prompt": custom_prompt}
    )

    result = chain({"question" : message})
    return result["answer"]

2. 混合模式:RAG + 直接LLM调用

如果希望Bot既能基于学习内容回答,又能自由处理通用问题,可以添加判断逻辑:先识别问题是否与学习内容相关,相关则用RAG,不相关则直接调用LLM回答:

def handleMessage(message):
    # 简单判断问题是否与学习内容相关(可优化为embedding相似度匹配)
    learning_keywords = ["Billie Eilish", "碧梨"]
    is_related = any(keyword in message for keyword in learning_keywords)
    
    llm = OpenAI(temperature=0)
    memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True, output_key="answer")

    if is_related:
        # RAG逻辑
        loader = TextLoader("./learning.txt")
        text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
        documents = text_splitter.split_documents(loader.load())
        embeddings = OpenAIEmbeddings()
        vectorstore = Chroma.from_documents(documents, embeddings)
        
        chain = ConversationalRetrievalChain.from_llm(
            llm,
            vectorstore.as_retriever(),
            memory=memory,
            return_source_documents=True,
            verbose=True,
        )
        result = chain({"question": message})
        return result["answer"]
    else:
        # 直接调用LLM回答通用问题
        return llm.predict(message)

3. 优化文本分割策略

将chunk_size调整为300-500,chunk_overlap设置为50-100,避免文本过度碎片化,保证检索到的内容具备完整语义。

三、Prompt配置要点

  1. 权限明确:在Prompt中清晰说明,当检索上下文不足时,可以调用通用知识补充回答,打破RAG的内容限制。
  2. 角色绑定:如果是角色模拟Bot,可加入角色设定,比如:"你现在要扮演Billie Eilish,结合提供的个人资料和通用知识,用Billie的语气回答问题。"
  3. 规则约束:根据需求添加格式、语气等要求,比如要求口语化回答、分点罗列信息等。

内容的提问来源于stack exchange,提问作者Nao COMATSU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:43:13