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

如何实现单个ChatBot对接不同QnA数据集并传递KNOWLEDGE_BASE_ID?

解决方案:单个Bot对接多QnA数据集与动态格式适配

Nice set of questions! Let's tackle them one by one since they're focused on making a single bot flexible enough to work with multiple QnA sources and formats.


1. 让单个Bot与两个不同QnA数据集交互

核心思路是动态切换QnA数据源,根据请求的来源(比如site1/site2)、用户上下文或者传入的标识来决定使用哪个数据集。这里分几个关键步骤:

步骤1:预加载或按需加载QnA数据集

你可以选择在Bot启动时把两个数据集都加载到内存(适合小型数据集),或者在收到请求时按需加载(避免占用过多内存)。示例代码(Python):

import json

# 加载QnA数据集的工具函数
def load_qna_dataset(file_path):
    with open(file_path, "r", encoding="utf-8") as f:
        return json.load(f)

# 预加载(可选,适合小型数据集)
qna1 = load_qna_dataset("qna1.json")
qna2 = load_qna_dataset("qna2.json")

步骤2:添加数据源判断逻辑

在Bot的消息处理流程中,加入判断分支,根据请求来源选择对应的数据集。比如:

  • 如果是Web嵌入的Bot,从URL参数获取站点标识(比如?source=site1)
  • 如果是API调用,从请求体或请求头获取标识
  • 如果是会话Bot,把站点标识存入会话上下文(避免重复传递)

示例处理逻辑:

def handle_user_message(query, source_site):
    # 根据来源选择数据集
    if source_site == "site1":
        active_qna = qna1
    elif source_site == "site2":
        active_qna = qna2
    else:
        return "Sorry, I can't connect to the right knowledge base right now."
    
    # 匹配问题并返回答案(这里用简单的模糊匹配,实际可以用更智能的算法)
    for pair in active_qna["qna_pairs"]:
        if query.lower() in pair["question"].lower():
            return pair["answer"]
    return "I don't have an answer for that question yet."

2. 实现单个ChatBot对接不同JSON格式QnA数据集并传递KNOWLEDGE_BASE_ID

当QnA数据集的JSON格式不同时,需要格式适配器来统一内部处理逻辑,同时通过KNOWLEDGE_BASE_ID来动态指定要使用的数据集。

步骤1:定义格式适配器

针对不同的QnA格式,写一个适配器函数,把原始JSON转换成Bot内部统一的格式(比如[{"question": "...", "answer": "..."}])。示例:

def adapt_qna_format(kb_id, raw_data):
    # QnA1格式示例:{"questions": ["如何重置密码?"], "answers": ["进入设置页面点击重置"]}
    if kb_id == "qna1":
        return [
            {"question": q, "answer": a} 
            for q, a in zip(raw_data["questions"], raw_data["answers"])
        ]
    # QnA2格式示例:{"faq_items": [{"q": "怎么退款?", "a": "联系客服提交申请"}]}
    elif kb_id == "qna2":
        return [
            {"question": item["q"], "answer": item["a"]} 
            for item in raw_data["faq_items"]
        ]
    else:
        raise ValueError(f"Unknown knowledge base ID: {kb_id}")

步骤2:动态传递KNOWLEDGE_BASE_ID

根据Bot的部署方式,有几种传递KNOWLEDGE_BASE_ID的方法:

  • Web嵌入场景:在嵌入Bot的URL中添加参数,比如site1的嵌入地址是https://your-bot-domain.com?kb_id=qna1,site2是https://your-bot-domain.com?kb_id=qna2。Bot初始化时读取URL参数即可。
  • API调用场景:在请求体中加入kb_id字段,比如:
    {
      "query": "如何修改个人信息?",
      "kb_id": "qna1"
    }
    
  • 会话Bot场景:在会话启动时,把kb_id存入会话上下文(比如Microsoft Bot Framework的TurnContext,Rasa的slot),后续消息直接使用上下文里的ID。

步骤3:整合加载与适配逻辑

把加载、适配和查询逻辑整合起来,示例:

def handle_bot_query(query, kb_id):
    try:
        # 加载原始数据
        raw_data = load_qna_dataset(f"{kb_id}.json")
        # 适配成统一格式
        formatted_qna = adapt_qna_format(kb_id, raw_data)
    except (FileNotFoundError, ValueError) as e:
        return f"Failed to connect to knowledge base: {str(e)}"
    
    # 执行查询
    for pair in formatted_qna:
        if query.lower() in pair["question"].lower():
            return pair["answer"]
    return "No matching answer found."

额外优化建议

  • 缓存数据集:把加载并适配后的QnA数据缓存起来(比如用Redis或内存缓存),避免每次请求都读取文件,提升响应速度。
  • 错误处理:增加对无效kb_id、缺失文件、格式错误的处理,返回友好提示。
  • 智能匹配:如果需要更精准的匹配,可以用向量数据库(比如FAISS)或预训练模型(比如BERT)来做语义匹配,替代简单的模糊匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:23:15