05 KnowledgeHandler 与 ChitChatHandler
学习理念:TaskHandler 处理"有步骤的任务",KnowledgeHandler 处理"查信息的问题",ChitChatHandler 处理"闲聊"。三者构成了完整的对话处理矩阵。KnowledgeHandler 用 Provider 模式抽象了不同的数据来源(API/FAQ/知识库),这种设计可以直接复用到任何需要多源检索的 Agent 场景中。
海外对标:LangChain Retriever(检索器抽象)、Rasa NLU(意图分类)
本节 AI 替代率:~70% | 人工干预率:~30%
| 角色 | 能力范围 |
|---|---|
| 🤖 AI 擅长 | 生成 KnowledgeProvider 接口、FAQ 检索代码 |
| 👤 人类需理解 | Provider 模式的扩展方式、有明确来源才让 LLM 生成的思路 |
📌 原文说明:以下内容来自
5.设计文档/KnowledgeHandler实现.md、ChitChatHandler实现.md,代码来自atguigu/knowledge/和atguigu/chitchat/。
📖 阅读优先级
| 等级 | 章节 | 说明 |
|---|---|---|
| 🟡 理解即可 | KnowledgeHandler | 了解 Provider 体系的设计思路 |
| 🟢 了解即可 | ChitChatHandler | 最简单的一个 Handler |
一、KnowledgeHandler——知识问答
🟡【理解即可】 KnowledgeHandler 的核心思想:不让 LLM 自由回答,而是先找到可信来源,再基于来源生成回复——这就是 RAG 的思路。
1.1 整体流程
1.2 知识意图(Knowledge Intents)
系统支持的知识意图及对应的处理方式:
| 意图 | 触发问题 | Provider 类型 | 数据来源 |
|---|---|---|---|
product_info | "这件商品是什么材质?" | API Provider | 电商后端 GET /products/{id} |
order_info | "这个订单现在什么情况?" | API Provider | 电商后端 GET /orders/{id} |
refund_policy | "退款政策是怎样的?" | FAQ Provider | 预设 FAQ 库 |
shipping_policy | "多久发货?包邮吗?" | FAQ Provider | 预设 FAQ 库 |
platform_rules | "平台有哪些限制?" | Knowledge Provider | 知识库文档 |
general_ecommerce | "优惠券怎么用?" | Knowledge Provider | 知识库文档 |
1.3 Provider 接口设计
🟡【P1 看注释就行】 所有 Provider 实现同一个接口,新增数据源只需加一个子类。
python
class KnowledgeProvider(ABC):
"""知识提供者接口"""
name: str # Provider 名称
@abstractmethod
async def retrieve(self, state: DialogueState) -> str:
"""根据对话状态检索相关信息,返回文本"""
...
class APIProvider(KnowledgeProvider):
"""调用电商后端 API 获取数据"""
async def retrieve(self, state: DialogueState) -> str:
# 从 focused_object 或 slots 中提取参数
# 调用电商 API /orders/{id} 或 /products/{id}
# 返回 JSON 文本
class FAQProvider(KnowledgeProvider):
"""从预设 FAQ 库中检索答案"""
async def retrieve(self, state: DialogueState) -> str:
# 匹配预设的 FAQ 条目
# 返回匹配的问答文本
class KnowledgeBaseProvider(KnowledgeProvider):
"""从知识库文档中检索"""
async def retrieve(self, state: DialogueState) -> str:
# 从向量库或文档检索
# 返回相关段落1.4 Provider 注册
python
class KnowledgeProviderRegistry:
def __init__(self):
self._providers: dict[str, KnowledgeProvider] = {}
def register(self, intent: str, provider: KnowledgeProvider):
self._providers[intent] = provider
def get_provider(self, intent: str) -> KnowledgeProvider | None:
return self._providers.get(intent)1.5 KnowledgeResponder
🟡【理解即可】 把 Provider 检索到的原始数据 + 用户问题一起给 LLM,让 LLM 基于来源生成自然语言回答。而不是让 LLM 凭空回答。
python
class KnowledgeResponder:
async def respond(self, state: DialogueState, retrieved_info: str, intent: str) -> BotMessage:
prompt = f"""
用户的问题是:{state.pending_turn.input_message.text}
检索到的相关信息:{retrieved_info}
请基于以上信息,用自然语言回答用户的问题。
如果信息不足以回答,请诚实说明。
"""
response = await self._llm.generate(prompt)
return BotMessage(text=response)二、ChitChatHandler——闲聊兜底
🟢【了解即可】 ChitChatHandler 是最简单的 Handler。当用户输入不属于任何任务或知识查询时,给出一个通用的欢迎/兜底回复。
python
class ChitChatHandler:
async def handle(self, state: DialogueState, plan: ChitchatTurnPlan) -> BotMessage:
return BotMessage(
text="你好,这里是 Atguigu 电商助手。我可以帮你查订单状态、查物流、了解商品信息,或者提交退款申请。"
)三种典型触发场景:
| 场景 | 用户输入 | 回复 |
|---|---|---|
| 打招呼 | "你好" | 通用欢迎语 |
| 模糊输入 | "你还挺聪明" | 感谢 + 引导业务流程 |
| 无效输入 | "asdf" | 通用兜底 |
三、三种 Handler 的对比
| 维度 | TaskHandler | KnowledgeHandler | ChitChatHandler |
|---|---|---|---|
| 触发条件 | turn_plan.task != None | turn_plan.knowledge != None | turn_plan.chitchat != None |
| 核心逻辑 | Flow + Command + Action | Provider 检索 → LLM 生成 | 固定回复 |
| 是否改状态 | ✅ 修改 active_task/slots | ❌ 不修改 | ❌ 不修改 |
| 外部依赖 | 电商 API、数据库 | 电商 API、FAQ、知识库 | 无 |
| 复杂度 | 🔴 高 | 🟡 中 | 🟢 低 |
四、本阶段文件索引
| 优先级 | 文件 | 路径 |
|---|---|---|
| 🟡 P1 | knowledge/handler.py | atguigu/knowledge/handler.py |
| 🟡 P1 | knowledge/providers.py | atguigu/knowledge/providers.py |
| 🟡 P1 | knowledge/intents.py | atguigu/knowledge/intents.py |
| 🟡 P1 | knowledge/responder.py | atguigu/knowledge/responder.py |
| 🟢 P2 | chitchat/handler.py | atguigu/chitchat/handler.py |
| 🟢 P2 | chitchat/responder.py | atguigu/chitchat/responder.py |
| 🟢 P2 | clarify/responder.py | atguigu/clarify/responder.py |