如何实现单个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
相关产品推荐
相关产品推荐

