【Agent智能体】42KnowledgeHandler设计实现

【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_infoapi.product、faq.default、rag.default
order_infoapi.order、faq.default、rag.default
refund_policyfaq.default、rag.default
return_policyfaq.default、rag.default
shipping_policyfaq.default、rag.default
platform_rulerag.default
general_ecommerce_infofaq.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)生成回复。