鸿蒙智能体开发实战:21.使用知识库
前言
在上一篇文章中,我们详细介绍了如何在小艺开放平台上创建和发布知识库。但知识库本身只是一个"资料仓库",只有将其整合到智能体中,配置合适的检索策略,才能真正发挥知识库的价值。
知识库与智能体的关系可以类比为"参考书"与"学生":参考书的内容再丰富,学生也需要知道如何查阅、理解什么内容、如何组织答案。本文就是要教会你的智能体如何"查阅参考书"来回答用户问题。
本文涵盖知识库在智能体中的绑定配置、检索参数调优、查询改写机制、无召回处理策略,以及在角色指令中引用知识库的高级用法。
知识库在智能体中的作用
三大核心价值
| 作用 | 说明 | 典型场景 |
|---|---|---|
| 知识增强 | 补充大模型未覆盖的特定领域知识 | 产品手册问答、行业法规咨询 |
| 事实控制 | 约束智能体基于给定数据回答,减少幻觉 | 企业知识库、技术支持 |
| 信息溯源 | 回答可追溯至原始文档,增强可信度 | 客服系统、教育培训 |
知识库问答的基本流程
用户提问 ↓ 智能体接收问题 ↓ 知识库检索 → 匹配相关段落 ↓ 大模型基于检索结果生成回答 ↓ 返回带引用的答案给用户图1:知识库问答的完整检索流程,包含阈值过滤和段落匹配
在智能体中添加知识库
操作步骤
- 进入智能体的编排页面
- 找到“知识库”配置区域
- 点击“添加”按钮
- 在弹出的对话框中,选择已创建的知识库
- 点击“确认添加”完成绑定
图2:在智能体编排页面的知识库配置区域添加知识库
一个智能体可以同时绑定多个知识库,知识库之间是并行检索的关系。系统会从所有已绑定的知识库中检索相关内容,合并后交给大模型生成答案。
多个知识库的管理策略
当绑定了多个知识库时,需要注意以下事项:
1. 知识库内容应尽量不重叠 例如:一个知识库存放产品文档,另一个存放常见问题 2. 检索范围无优先级区分 系统会从所有绑定的知识库平等地检索内容 3. 合理控制总数据量 过多数据可能影响检索效率知识库检索配置详解
在智能体的知识库设置中,有三个关键参数直接影响检索效果。
检索文本相关阈值
定义:设置检索召回知识库段落的相关系数,范围0~1。
工作原理:
# 检索阈值的工作原理示意defsearch_with_threshold(query:str,threshold:float)->list:""" 根据阈值筛选检索结果 Args: query: 用户查询 threshold: 相似度阈值 (0~1) Returns: 大于等于阈值的匹配段落 """# 1. 对查询进行向量化query_vector=embed_query(query)# 2. 在知识库中搜索相似段落all_segments=search_similar(query_vector)# 3. 根据阈值过滤filtered=[segforseginall_segmentsifseg.similarity_score>=threshold]returnfiltered阈值选择建议:
| 阈值范围 | 效果 | 适用场景 |
|---|---|---|
| 0.7~0.9 | 高精度,只返回高度相关的内容 | 技术文档、法规条款等需要高准确性场景 |
| 0.5~0.7 | 平衡模式,兼顾精度和召回 | 通用知识问答 |
| 0.3~0.5 | 高召回,返回大量相关内容 | 探索性问答、创意生成 |
系数设置越高,返回给大模型的内容片段完整度和相关度越高,大模型生成的回复准确性也就越高。
系数设置越低,返回给大模型的内容片段完整度和相关度越低,准确性和可用性也就越低。
最大召回分段数
定义:召回并输入给大模型的最大分段数,范围0~20。
配置建议:
| 分段数 | 场景 | 说明 |
|---|---|---|
| 1~3 | 精确问答 | 只使用最相关的少数段落 |
| 4~8 | 综合问答 | 适用于内容覆盖较广的查询 |
| 9~20 | 复杂分析 | 需要大量参考信息的场景 |
数值越大,返回给大模型的内容片段越多,但可能引入噪声;数值越少,内容越精准,但可能遗漏相关信息。
最大召回Token数
定义:召回并输入给大模型的最大token数,范围0~999999。
配置建议:
- 简单问答场景:1000~3000 tokens - 综合知识问答:3000~8000 tokens - 复杂分析场景:8000~20000 tokens 注意:token数不宜过大,否则会: 1. 增加大模型的处理时间和成本 2. 引入过多无关信息,影响回答质量 3. 可能超过大模型的上下文窗口限制参数配置示例
{"knowledge_base_config":{"retrieval_threshold":0.65,"max_segments":5,"max_tokens":5000,"query_rewrite":true}}查询改写机制
为什么需要查询改写
在多轮对话中,用户的问题通常依赖于上下文语境,仅凭用户最新一条提问可能无法准确识别其真实检索意图。例如:
问题1:知识库检索节点可以用来做什么? 回复1:知识库检索节点可以基于用户输入查询指定的知识库... 问题2:怎么用?对于问题2,如果脱离上下文,系统无法判断用户指的是"知识库检索节点怎么用"。查询改写正是为了解决这个问题。
查询改写的工作原理
原始用户输入: "怎么用?" ↓ 结合对话历史上下文 ↓ 改写后输入: "知识库检索节点怎么用?" ↓ 执行知识库检索查询改写的配置
在知识库设置中,知识库检索节点默认开启查询改写。你无需额外配置即可享受查询改写的效果。
# 查询改写的逻辑示意defquery_rewrite(original_query:str,conversation_history:list)->str:""" 基于对话历史改写用户查询 Args: original_query: 用户当前输入 conversation_history: 对话历史列表 Returns: 改写后的完整查询 """# 结合上下文构建完整查询意图context=extract_context(conversation_history)rewritten=llm_rewrite(original_query,context)returnrewritten查询改写的最佳实践
- 默认开启:绝大多数场景下建议保持开启
- 长对话场景:查询改写效果更明显
- 问题切换场景:当用户切换到新话题时,改写能自动适应
- 关闭场景:如果每次查询完全独立,不需要历史上下文,可以关闭
无召回回复配置
当知识库中没有匹配到相关内容时,需要给用户一个合理的回应。
配置方式
知识库支持两种无召回回复模式:
| 模式 | 说明 | 示例 |
|---|---|---|
| 默认回复 | 系统使用预设的通用回复语 | “抱歉,这个问题不在知识范围内” |
| 自定义回复 | 开发者自定义回复内容 | “抱歉,暂时未检索到相关内容,有疑问请联系XXX” |
自定义回复配置示例
# 知识库无召回回复配置no_recall_response:type:custom# 或 defaultmessage:"抱歉,我没有找到关于这个问题的信息。请尝试换个方式提问,或联系我们的技术支持团队。"自定义回复可以包含公司名称、联系方式等信息,让用户体验更加友好。
在角色指令中引用知识库
除了自动检索外,你还可以在智能体的角色指令中显式引用知识库内容。
引用语法
在角色指令中,你可以使用特定语法来指导智能体如何利用知识库:
## 角色指令示例 你是一个产品技术支持专家。在回答用户问题时,请遵循以下规则: 1. 当用户询问产品功能时,优先参考知识库中的产品文档 2. 如果知识库中有明确的答案,直接引用并注明来源 3. 如果知识库中没有相关信息,告知用户并尝试提供通用建议 4. 不确定的内容不要编造,坦诚说明不确定性知识库引用指南
## 知识库使用规则 - 知识库是唯一的权威信息来源 - 回答中应体现知识库中的具体内容 - 当知识库内容与大模型知识冲突时,以知识库为准 - 可引用知识库中的特定章节或段落知识库问答效果测试
测试方法
配置完成后,建议通过以下方式测试知识库的效果:
在编排页面直接对话测试
- 在智能体编排页面的调试与预览区域发送问题
- 观察回答是否基于知识库内容
对比测试
- 分别测试"开启知识库"和"关闭知识库"的回答差异
边界测试
- 测试知识库覆盖范围内的问题
- 测试知识库未覆盖的问题(观察无召回回复)
- 测试模糊含义的问题(观察查询改写效果)
测试用例清单
# 知识库测试用例test_cases=[# 1. 知识库覆盖范围内的问题{"query":"产品的保修期是多久?","expected":"基于知识库回答"},# 2. 需要多轮上下文的问题{"query":"那过期了怎么办?","expected":"基于上文+知识库综合回答"},# 3. 知识库未覆盖的问题{"query":"你们的竞争对手产品怎么样?","expected":"无召回回复"},# 4. 模糊查询{"query":"怎么弄?","expected":"查询改写后检索"},]调试技巧
如果发现知识库回答不符合预期,可以从以下角度排查:
# 知识库调试检查清单# 1. 检查知识库状态知识库是否已发布? → 确认状态为"已上架"# 2. 检查绑定关系智能体是否已绑定知识库? → 确认知识库在智能体配置中# 3. 检查检索参数阈值是否过高导致没有召回? → 尝试降低阈值 分段数是否太少? → 增加最大召回分段数# 4. 检查查询改写是否开启了查询改写? → 确认配置 对话历史是否正确传递? → 检查会话上下文知识库使用最佳实践
检索配置优化策略
# 推荐的检索配置策略# 策略一:高精度模式(适用于法规、合同等场景)strategy_high_precision:threshold:0.8max_segments:3max_tokens:2000rewrite:true# 策略二:平衡模式(适用于通用问答)strategy_balanced:threshold:0.65max_segments:5max_tokens:5000rewrite:true# 策略三:高召回模式(适用于探索性问答)strategy_high_recall:threshold:0.45max_segments:10max_tokens:10000rewrite:true多知识库场景建议
按主题拆分知识库
- 产品知识库、技术文档库、FAQ库等
- 便于管理和更新
控制单个知识库大小
- 推荐单个知识库文件不超过50个
- 过大的知识库影响检索效率
定期更新知识库
- 设置更新周期(建议每月审查一次)
- 及时淘汰过时的内容
常见问题排查
Q: 为什么知识库没有返回结果?
A: 可能的原因:阈值设置过高、知识库内容与查询不匹配、知识库尚未发布、绑定关系未生效。
Q: 为什么回答不够准确?
A: 尝试降低阈值以召回更多段落,或增加最大召回分段数。同时检查知识库文档的质量和覆盖范围。
Q: 多轮对话中知识库检索不准确怎么办?
A: 确认查询改写功能已开启。如果关闭了查询改写,在多轮对话中用户的简短提问可能无法被准确理解。
总结
本文详细介绍了在智能体中使用知识库的各项配置和优化策略:
- 添加知识库:绑定多个知识库到智能体的操作步骤
- 检索配置:文本相关阈值、最大召回分段数、最大召回Token数的调优方法
- 查询改写:多轮对话中自动理解用户意图的机制
- 无召回处理:知识库未命中时如何优雅回应
- 角色指令集成:在指令中明确知识库使用策略
- 测试与调试:确保知识库问答效果的验证方法
知识库的威力不仅在于创建,更在于合理配置检索策略,使其与智能体的角色定位、业务场景完美匹配。掌握这些配置技巧,你的智能体将能够更精准、更可靠地回答用户问题。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
- 小艺开放平台 - 开发者控制台
- 知识库开发指南 - 官方文档
- 在智能体中添加知识库 - 官方文档
- 智能体编排指南 - 官方文档
- 华为开发者联盟 - 文档中心
- 小艺开放平台 - 知识库配置说明
- 《生成式人工智能服务管理暂行办法》
- 华为开发者联盟 - 管理控制台