【Agent智能体】42KnowledgeHandler设计实现
章节四十二:KnowledgeHandler设计与实现
一、KnowledgeHandler设计
1.1 概述
KnowledgeHandler:负责处理知识问答类请求。根据用户问题检索信息,将检索到的信息连同用户问题一起交给大模型生成回复。
ChitChatHandler:负责处理闲聊类请求。读取最近对话历史,将历史和用户最后一句话一起交给大模型,生成自然的闲聊回复。
1.2 知识意图定义
KnowledgeHandler中定义了如下知识意图,TurnPlanner会将用户问题归到某个知识意图:
| 知识意图 | 说明 |
|---|---|
| product_info | 商品信息咨询 |
| order_info | 订单信息咨询 |
| refund_policy | 退款政策咨询 |
| return_policy | 退货政策咨询 |
| shipping_policy | 配送政策咨询 |
| platform_rule | 平台规则咨询 |
| general_ecommerce_info | 电商通用信息咨询 |
1.3 信息源类型
不同意图对应不同的信息源,当前系统有三类信息源:
| 信息源 | 说明 |
|---|---|
| api | 查询实时业务数据,例如商品、订单 |
| faq | 查询标准问答 |
| rag | 查询文档知识库 |
意图与信息源的对应关系:
| 知识意图 | 信息源列表 |
|---|---|
| product_info | api.product、faq.default、rag.default |
| order_info | api.order、faq.default、rag.default |
| refund_policy | faq.default、rag.default |
| return_policy | faq.default、rag.default |
| shipping_policy | faq.default、rag.default |
| platform_rule | rag.default |
| general_ecommerce_info | faq.default、rag.default |
1.4 KnowledgeHandler处理流程
第一步:DialogueEngine根据用户消息预测知识意图。
第二步:进入KnowledgeHandler,编排知识问答流程。
第三步:KnowledgeContextBuilder构建上下文对象,包含用户消息、最近历史、聚焦对象和知识意图。
第四步:KnowledgePlanner根据知识意图和上下文选择本轮要查询的信息源。
第五步:KnowledgeProviderRegistry根据provider ID找到对应的KnowledgeProvider。
第六步:KnowledgeProvider从具体信息源中获取数据,返回KnowledgeChunk(知识片段)。
第七步:KnowledgeResponder将检索到的信息和用户问题组装成提示词,交给大模型生成回复。
第八步:返回BotMessage(最终客服消息)。
1.5 ChitChatHandler处理流程
第一步:ChitChatHandler接收闲聊消息。
第二步:提取最近对话历史(recent_turns)。
第三步:提取用户最后一句话(user_message)。
第四步:ChitChatResponder组装提示词并调用大模型。
第五步:返回BotMessage(闲聊回复)。
二、KnowledgeHandler实现
2.1 入口方法
KnowledgeHandler的handle()接收两个参数:
- state:当前完整对话状态
- intents:本轮命中的知识意图列表
处理流程:
第一步:读取pending_turn.input_message(当前用户问题)。
第二步:读取state.recent_turns(最近对话历史)。
第三步:根据intents合并provider_ids并去重。
第四步:通过KnowledgeProviderRegistry.get()查找对应的Provider。
第五步:调用Provider.retrieve()获取知识片段(KnowledgeChunk列表)。
第六步:调用KnowledgeResponder.respond(),将用户问题、对话历史和知识片段交给大模型生成回复。
第七步:返回BotMessage。
2.2 KnowledgeIntent
KnowledgeIntent描述一种知识问答意图及其需要的provider。字段包括:id(意图ID)、description(意图说明)、provider_ids(需要查询的provider列表)、requires_object(是否要求有聚焦对象)。
例如product_info意图需要api.product,且要求聚焦对象类型为product;order_info需要api.order,且要求聚焦对象类型为order。
2.3 KnowledgeProvider
KnowledgeProvider是知识来源的基类,每个provider负责根据当前DialogueState检索知识并返回KnowledgeChunk列表。
ProductApiProvider:查询商品实时信息。从focused_object获取商品ID,调用商品详情接口,将结果格式化后返回KnowledgeChunk。
OrderApiProvider:查询订单和物流实时信息。从focused_object获取订单号,使用asyncio.gather()并发查询订单API和物流API,合并结果后返回KnowledgeChunk。
FaqKnowledgeProvider和RagKnowledgeProvider:当前为占位实现,后续可接入具体的FAQ库和RAG知识库。
2.4 KnowledgeProviderRegistry
KnowledgeProviderRegistry根据provider id查找provider。初始化时把provider列表转换为字典(provider_id到provider实例),实现O(1)快速查找。
2.5 KnowledgeResponder
KnowledgeResponder负责把知识片段、对话历史和用户问题交给大模型,生成最终客服回复。
处理流程:
第一步:拼接knowledge_content(合并所有知识片段的内容)。
第二步:构建history(格式化最近对话历史)。
第三步:组装LangChain chain(调用大模型的执行链)。
第四步:调用LLM生成回复。
第五步:返回BotMessage。
提示词模板要点:角色设定为中文电商客服助手,语气自然友好简洁;优先基于知识片段作答,不编造不存在的内容;信息不足时坦诚告知;不机械复述资料原文。
2.6 KnowledgeHandler总入口
最终的总入口流程:
第一步:从state.pending_turn.input_message读取当前用户问题。
第二步:从state.recent_turns(10)读取最近10轮对话历史。
第三步:根据intents合并provider列表并去重。
第四步:遍历provider_ids,调用registry.get()获取Provider,再调用provider.retrieve(state)获取知识片段。
第五步:调用responder.respond(user_message, recent_turns, chunks)生成回复。