Skip to content

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实现.mdChitChatHandler实现.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 的对比

维度TaskHandlerKnowledgeHandlerChitChatHandler
触发条件turn_plan.task != Noneturn_plan.knowledge != Noneturn_plan.chitchat != None
核心逻辑Flow + Command + ActionProvider 检索 → LLM 生成固定回复
是否改状态✅ 修改 active_task/slots❌ 不修改❌ 不修改
外部依赖电商 API、数据库电商 API、FAQ、知识库
复杂度🔴 高🟡 中🟢 低

四、本阶段文件索引

优先级文件路径
🟡 P1knowledge/handler.pyatguigu/knowledge/handler.py
🟡 P1knowledge/providers.pyatguigu/knowledge/providers.py
🟡 P1knowledge/intents.pyatguigu/knowledge/intents.py
🟡 P1knowledge/responder.pyatguigu/knowledge/responder.py
🟢 P2chitchat/handler.pyatguigu/chitchat/handler.py
🟢 P2chitchat/responder.pyatguigu/chitchat/responder.py
🟢 P2clarify/responder.pyatguigu/clarify/responder.py

OPC 超级个体实战指南