胡慧华
菜单
首页人工智能机器学习深度学习项目实践关于我
跳至课程正文
← 人工智能课程

ARTIFICIAL INTELLIGENCE · COURSE 18

综合实践:设计一个带引用的知识问答助手

串起需求、资料、检索、回答、评估和兜底,完成学习闭环。

第 18 / 18 课20–30 分钟(含实验)无需密钥 · 本地实验
平衡的数据托盘、透明保护环与评估网格,呈现可靠性和负责任的人工智能
让效果经得起验证
  • 综合实践
  • 完整闭环
01

START WITH A QUESTION

把整条学习路线收束为一个可验证的小助手

现在把任务定义、资料治理、检索、引用、权限和评估连起来。目标不是造一个什么都回答的机器人,而是用几条虚构制度做一个知道自己何时该停止的知识问答助手。

本课沙盒完全在本地运行:资料固定,检索规则可见,回答使用原文摘录,不调用大语言模型。这样你能逐环节看见依据与失败点。真实生成模型可以在之后接入,但不能替代权限和验证。

02

BUILD YOUR VOCABULARY

先把三个概念讲清楚

CONCEPT 01

最小可验证系统

只包含完成目标和验证关键假设所需的环节。功能少,但输入、输出、边界和验收是完整的。

放进场景看

只回答材料与审批,未知金额明确不回答。

CONCEPT 02

证据契约

每个答案都带来源、版本与适用范围;资料不足或越权时保持拒答。引用是可以回到原文核对的连接。

放进场景看

发票要求对应资料 E1,审批要求对应资料 E2。

CONCEPT 03

验收闭环

预先给出普通、未知、过期和权限问题,对同一系统重复运行并记录结果。失败回到对应环节修复。

放进场景看

更改访问身份后,受限资料必须在检索前消失。

03

FOLLOW THE PROCESS

把原理放进完整流程

  1. 01

    定义范围

    目标是回答有效制度中的报销与会议问题,超出范围说明无法确认。

  2. 02

    治理与检索

    先过滤权限和过期资料,再按查询找到证据,不泄露被过滤内容。

  3. 03

    返回可核对答案

    只摘录证据并给出编号;无证据时不补充猜测。

  4. 04

    验收并记录

    运行四类测试,记录失败位置与修复建议,保存当前配置。

交付之前,至少检查四类问题
测试期望行为失败定位
报销材料返回有效资料及引用检索或引用
未知金额明确资料不足无答案处理
受限信息不返回受限内容权限过滤
过期规则不使用失效版本资料治理
04

CHANGE ONE THING & OBSERVE

验收你的带引用知识助手

选择查询、访问身份与是否执行有效期过滤,运行检索并检查引用。再运行固定验收集,观察错误配置如何被测试发现。

INTERACTIVE LAB / 18

身份选择只是教学模拟,真实系统必须从认证服务获取身份,不能让用户任意切换权限。资料与输出不发送到外部服务。

05

KNOW THE LIMITS

哪些结论不能直接推出?

把摘录原型包装成大模型

本例主动展示规则与摘录,不声称理解任意自然语言。增加生成能力后,需要重新评估忠实度。

为了演示成功而跳过失败样例

无答案、过期和越权测试正是产品边界的一部分,应与正常样例一同交付。

06

READ, RUN & EXPLAIN

一个可运行的本地知识检索闭环

以下示例仅使用 Python 3 标准库,可复制到本地 Python 环境运行。先看每一行的作用,再修改一个输入观察结果;无需网络或密钥。

Python 3 · 完整示例下载 .py
docs = [
    {'id': 'E1', 'topic': '报销材料', 'text': '报销需提交发票与报销单。', 'group': '员工', 'active': True},
    {'id': 'E2', 'topic': '报销审批', 'text': '报销提交后由主管审批。', 'group': '员工', 'active': True},
    {'id': 'M1', 'topic': '会议预订', 'text': '会议室预订需登记使用时间。', 'group': '员工', 'active': True},
    {'id': 'H1', 'topic': '人事记录', 'text': '受限教学记录,仅人事可查。', 'group': '人事', 'active': True},
    {'id': 'E0', 'topic': '报销材料', 'text': '旧版规定不需要发票。', 'group': '员工', 'active': False},
]
query, group = '报销', '员工'
allowed = [d for d in docs if d['group'] == group and d['active']]
hits = [d for d in allowed if query in d['topic']]
answer = '\n'.join(d['text'] + ' [' + d['id'] + ']' for d in hits)
print(answer or '当前可访问的有效资料不足')
assert all(d['active'] and d['group'] == group for d in hits)

复制或下载只获取本课示例,不会自动执行。

逐行解释(13 行)
  1. 第 1 行docs = [

    开始定义小型知识库。字段分别保存编号、主题、正文、访问组和是否有效。

  2. 第 2 行 {'id': 'E1', 'topic': '报销材料', 'text': '报销需提交发票与报销单。', 'group': '员工', 'active': True},

    第一条是员工可查看的有效报销资料。

  3. 第 3 行 {'id': 'E2', 'topic': '报销审批', 'text': '报销提交后由主管审批。', 'group': '员工', 'active': True},

    与开场相同的有效审批条款。

  4. 第 4 行 {'id': 'M1', 'topic': '会议预订', 'text': '会议室预订需登记使用时间。', 'group': '员工', 'active': True},

    与开场相同的会议资料,不匹配报销主题。

  5. 第 5 行 {'id': 'H1', 'topic': '人事记录', 'text': '受限教学记录,仅人事可查。', 'group': '人事', 'active': True},

    H1是受限资料,不应交给普通员工。

  6. 第 6 行 {'id': 'E0', 'topic': '报销材料', 'text': '旧版规定不需要发票。', 'group': '员工', 'active': False},

    E0已失效,不能作为当前回答依据。

  7. 第 7 行]

    结束知识库列表。

  8. 第 8 行query, group = '报销', '员工'

    指定当前查询和经认证的访问组,示例身份是预设的。

  9. 第 9 行allowed = [d for d in docs if d['group'] == group and d['active']]

    先做权限与有效性过滤,再进入检索。

  10. 第 10 行hits = [d for d in allowed if query in d['topic']]

    按主题关键词检索,只能处理明确范围内的查询。

  11. 第 11 行answer = '\n'.join(d['text'] + ' [' + d['id'] + ']' for d in hits)

    摘录命中原文并附上来源编号。

  12. 第 12 行print(answer or '当前可访问的有效资料不足')

    没有命中时明确停止,不生成猜测。

  13. 第 13 行assert all(d['active'] and d['group'] == group for d in hits)

    assert 是断言:检查命中资料都满足有效性与权限,失败会报错。

预期输出
报销需提交发票与报销单。 [E1]
报销提交后由主管审批。 [E2]
07

CHECK YOUR UNDERSTANDING

换一个角度,检查自己是否理解

已回答 0 / 3 题 · 当前答对 0 题

1. 权限过滤应在哪个环节做?
2. 本课原型如何组织答案?
3. 接入生成模型后可以省去哪一项?
08

TAKE IT WITH YOU

带走三个判断,再做一次迁移练习

  • 从可验收的小任务开始,保留全流程。
  • 权限、有效期、证据和拒答是功能的一部分。
  • 先跑通可解释基线,再用相同测试比较复杂方案。
参考与延伸阅读

本课例子、代码和模拟数据为教学设计。以下一手文档用于延伸核对,不代表对本示例的认证。