主题模型:
用 AI Agent 发现文本结构

从 Prompt 到 OpenClaw,实战主题分析

第八课
郑思尧
上海交通大学 国际与公共事务学院

为什么今天不聊 LDA?

2020 年的做法

清洗文本 → 构建 DTM → 跑 LDA → 读词表 → 命名话题
全程手写 Python,半天起步
Grimmer 2010 用的是这套

2026 年的做法

把文本给 AI Agent → 它帮你发现话题、命名、生成报告
你负责验证和判断
你现在用 OpenClaw 就能做到

LDA 的统计原理你在 L05 已经学过。今天:直接用 AI Agent 做主题分析,实战落地

今天的路线图

Prompt
Part 1
用 Prompt 做主题分析
对话即分析,但陷阱在哪?
Agent
Part 2
AI Agent 做主题分析
OpenClaw 如何让 Agent 自主完成全流程
验证
Part 3
输出可信吗?
幻觉、一致性、人工校验
实战
Part 4
行业实战 + OpenClaw 实操
从数据到决策的完整链路

Part 1 / 4 用 Prompt 做主题分析:
对话即分析

最简单的主题分析:三条消息搞定

第 1 条消息 — 投喂文本
以下是一批市民热线投诉的摘要,共 50 条:

1. 挂号排队 3 小时,老人站着等不了
2. 学校门口堵车严重,孩子上学不安全
3. 小区门口烧烤摊油烟扰民
...

[第 4–50 条...]
第 2 条消息 — 提取话题
请从这些投诉中提取主要话题(不超过 6 个),每个话题给:名称、关键词、典型投诉示例、覆盖条数。输出 JSON。
第 3 条消息 — 深入分析
"医疗等候"和"就医费用"是否应该合并?各话题之间的关联是什么?用一段话总结这些投诉的核心矛盾。

你得到了什么?

AI 为你做的

发现了 5 个话题
给每个话题命名 + 关键词 + 示例
分析了话题间的关系
生成了结构化 JSON + 可读摘要

但你要警惕的

换个 Prompt,话题可能完全不同
跑两次,话题标签可能不一样
没有概率分布——无法做回归
AI 可能"幻觉"出文本里没有的话题

Prompt 就是 2026 年的代码——但代码需要测试,Prompt 也需要验证。

Prompt 设计:三条原则

约束粒度
"提取主要话题" → 模糊
"提取不超过 6 个话题,每个含名称、3-5 关键词、典型示例" → 精确
越具体,输出越稳定
格式约束
要求 JSON 输出
指定字段名和类型
结构化输出才能做下游处理
(回归、可视化、跨语料对比)
验证指令
"每个话题必须引用原文至少 1 条"
"话题间不得重叠"
强迫 AI 自检,减少幻觉

好的 Prompt = 好的研究设计。Prompt 越像研究方案,输出越像研究结果。

Prompt 是 2026 年
最核心的分析接口

三条消息就能做主题分析
但输出质量完全取决于 Prompt 设计
对话即分析,但对话需要设计

PART 2 → 如果让 AI Agent 自主跑完全流程呢?

Part 2 / 4 AI Agent 做主题分析:
从对话到自主行动

从"你问它答"到"它自己干"

聊天工具传统

你:帮我分析这些投诉
AI:好的,5 个话题是...
你:按部门统计一下
AI:好的,统计结果是...
每一步都靠你驱动

AI Agent2026

你:分析这批投诉,给我报告
Agent:我来分步执行——
① 读文件 ② 提取话题 ③ 统计分布
④ 生成图表 ⑤ 写报告
自主规划,调用工具,多轮迭代

Agent = LLM + 工具调用 + 记忆 + 自主循环。你给它目标,它自己拆解执行。

Agent 的核心:感知→思考→行动→观察

1
感知 (Intake)
收到你的指令:"分析这 5000 条投诉"。加载记忆:之前做过类似任务吗?
2
思考 (Inference)
LLM 推理:需要分步——读取文件、提取话题、统计分布、生成报告。规划工具调用顺序。
3
行动 (Tool Use)
调用工具:读文件系统、执行 Python 脚本、搜索记忆、写入结果。每步都有实际操作。
4
观察 (Observe)
检查工具返回:话题分布合理吗?不够好?调参重跑。结果满意?进入下一步。循环直到完成。
OpenClaw Agent Loop
OpenClaw 的 Agent 循环就是这套 7 步管线:Intake → Queue → Context → Inference → Tool Use → Streaming → Persist
每一轮都是一次完整的"感知→思考→行动→观察",串行执行,自动循环

OpenClaw:你课堂上的 AI Agent 平台

是什么
开源自托管网关(MIT 协议)
连接聊天应用 → AI 编程 Agent
支持 WhatsApp / Telegram / Discord / iMessage / 企业微信
一台服务器,所有平台统一接入
核心能力
多模型切换(GLM 5 / DeepSeek / Qwen3)
Agent 工具调用(文件系统/Python/浏览器)
长期记忆(MEMORY.md + 向量检索)
多 Agent 路由(不同专长协作)

这学期你们用的就是这个 — ailab.sjtu.edu.cn 上的 OpenClaw 实验环境,每个同学独立容器

OpenClaw 做主题分析:你只需要一句话

你的指令
"帮我分析 /workspace/data/complaints.csv 里的 5000 条市民投诉,提取主要话题,统计每个话题的投诉数和占比,生成可视化图表,最后写一份分析报告保存到 /workspace/output/"
读取 CSV
Agent 调用文件读取工具,加载数据,了解字段结构
提取话题
Agent 用 LLM 逐批分析文本,提取话题标签和关键词,汇总去重
统计 + 可视化
Agent 执行 Python 脚本,统计各话题投诉数占比,生成柱状图/饼图
写报告
Agent 将分析结果、图表、核心发现写入 Markdown 报告,保存到指定路径

Agent 的记忆:为什么它"认识"你

短期记忆
当前对话的上下文窗口
你刚才说的、Agent 刚做的
会话结束或窗口满了 → 自动压缩
长期记忆
MEMORY.md — 你让 Agent 记住的东西
memory/YYYY-MM-DD.md — 每日日志
向量索引 — 语义检索"上次聊了什么"
可跨会话持久保存

对主题分析的意义:你第一次让 Agent 分析投诉,它记住话题结构;下次你说"跟上次对比",它直接从记忆调取上次结果,不用重跑。

多 Agent 协作:不同专长,分工干活

你的指令
分析投诉
协调器
任务分配
提取 Agent
话题发现
统计 Agent
计算分布
报告 Agent
写成文档
OpenClaw 多 Agent 路由
OpenClaw 支持多个 Agent 绑定不同渠道和技能,通过路由规则自动分发任务
例:微信群发来的消息 → 路由到"客服 Agent";钉钉发来的 → 路由到"分析 Agent"
不同 Agent 可以有不同的 system prompt、模型、工具权限和记忆空间

Agent 让主题分析
从"你问它答"变成
"它自己干"

一句话指令 → Agent 自主规划 4 步流程
读数据、提取话题、统计可视化、写报告
但你要检查——Agent 也会犯错

PART 3 → 怎么验证 Agent 的输出?

Part 3 / 4 输出可信吗?
幻觉、一致性、人工校验

Agent 做主题分析的三种风险

幻觉
Agent 可能"发明"
文本里没有的话题
例:编造一个"城市绿化"话题,实际语料没有相关投诉
不一致
同一语料跑两次
话题数和标签不同
无法复现 = 无法检验 = 不是科学
偏见放大
模型训练数据有偏见
话题命名可能带倾向性
"闹事"vs"维权" — 同一话题,命名决定叙事

四步验证法

源文抽检
话题与原文对齐
交叉验证
两种 Prompt 对比
领域审读
专家判断合理性
文档化
Prompt + 输出 + 验证记录

① 源文抽检:每个话题随机抽 5 条原文,检查是否真的属于该话题。准确率 < 80% → Prompt 有问题,要改。

② 交叉验证:用两种不同 Prompt 提取同一语料的话题,对比重叠度。重叠 > 70% → 话题结构较稳定。

让 Agent 自己验证自己的输出

VERIFICATION PROMPT
以下是刚才提取的 5 个话题。请逐个验证:

1. 随机抽取该话题下的 3 条原文,检查是否确实属于该话题
2. 如果发现不属于,指出原因并建议是否需要拆分或合并
3. 检查话题命名是否中立(不带倾向性措辞)
4. 检查是否遗漏了重要但文本量少的话题
OpenClaw 实操
你可以直接在 OpenClaw 对话中追加这条验证指令
Agent 会读取刚才的输出、回溯原文、逐条检查——
但它自己检查自己不能替代你的最终审读

当需要"做统计"时

Agent 能做的

发现话题、命名、生成报告
语义理解、跨语料对比
快速、灵活、可对话
+

统计模型补充的

概率分布(每篇文档的话题占比)
假设检验("党派效应显著吗?")
可复现、可量化、可审计

实操建议:先用 Agent 做探索(快),确认话题结构后再跑统计模型做正式推断(严谨)。
Agent 的输出帮你确定 k 和话题命名 → 统计模型验证并给出量化结果

信任但要验证
尤其当你用 AI

幻觉、不一致、偏见 — 三种风险
源文抽检、交叉验证、领域审读、文档化
Agent 能帮你验证,但你负最终责任

PART 4 → 行业实战 + OpenClaw 实操

Part 4 / 4 行业实战:
从数据到决策的完整链路

AI Agent 主题分析完整流程

上传文本
CSV/Excel
Agent
提取话题
Agent
统计+图
你审读
验证
Agent
写报告
决策
行动
今天实操环节
登录 ailab.sjtu.edu.cn → 打开 OpenClaw → 配置模型(GLM 5)
上传课堂提供的数据文件 → 让 Agent 分析 → 验证输出 → 生成报告

行业实战:医疗

场景
5 万条患者满意度问卷开放题
Agent 指令:分析投诉话题,按科室统计分布,生成科室级改进建议报告
Agent 执行
自动发现 6 个话题 + 生成科室对比图
就医流程、医生态度、费用、环境、等待时间、治疗效果
外科"等待时间"占比显著高于内科 → Agent 标注为高风险
你的验证
抽检 + 话题命名确认
每个 Agent 命名的话题,你确认是否符合临床语境
"术后沟通不足" — 这种微妙话题 Agent 能发现,但你要确认不是幻觉
注意事项
隐私合规 + 人工审读
医疗数据脱敏后才能上传给 Agent
高风险场景的 Agent 输出必须人工复核,不能直接用于决策

行业实战:政府

场景
政务热线 10 万条来电 + 3 年历史数据
Agent 指令:提取话题 + 对比年度变化 + 标注政策关联事件
Agent 执行
8 个话题 + 年度趋势图 + 政策关联
发现"环保"话题在某新规发布后占比翻倍
Agent 自动写进报告:"可能与 2025 年 X 政策相关"
你的验证
因果推断 Agent 做不了
Agent 能发现"相关性"(环保占比翻倍)
因果(是不是政策导致的)必须你来做研究设计
Agent 发现现象,你解释因果
决策输出
政策效果评估 + 资源调配建议
Agent 生成的是描述性报告 → 你的因果研究才能回答"政策有效吗"
两者结合 = 有据可依的政策建议

行业实战:金融

场景
2000 份分析师研报 + 财报电话会议纪要
Agent 指令:提取本季度核心风险话题,与上季度对比变化
Agent 执行
话题提取 + 季度对比 + 风险信号
"监管合规"话题从 12% 升至 21%
Agent 细分为"反垄断""数据合规""跨境监管" — LDA 的 BoW 做不到这种语义区分
你的验证
金融场景对幻觉零容忍
每条风险信号必须追溯到原文出处
Agent 的"数据合规"标签 → 你回去查那篇原文 → 确认真的是在讲数据合规
决策输出
季度风险信号报告
Agent 定量追踪 + 语义细分 → 投委会据此调整仓位
关键是:每条结论都有原文追溯链

实操:OpenClaw 主题分析四步走

Step 1 — 登录 + 配置
ailab.sjtu.edu.cn → 进入课程 → 开始连接
打开 Web 终端 → 粘贴配置命令 → 获取 Token
打开 Agent 网关 → 输入 Token → 设备配对
模型默认 sjtu/glm-5,可用 /model 切换
Step 2 — 上传数据
在对话中粘贴文本,或上传 CSV 文件
Agent 自动读取文件内容
支持 /workspace/ 目录下的文件操作
Step 3 — 发出分析指令
"分析这些文本,提取主要话题,
统计各话题占比,生成饼图和柱状图,
写一份 Markdown 报告保存到 /workspace/output/"
Step 4 — 验证 + 迭代
抽检每个话题的原文归属
让 Agent 验证自己的输出
不满意?追加指令让它调整
对话式迭代,不用重写代码

AI 时代,研究者做什么?

设计
研究问题 → 分析方案
Prompt 就是你对 Agent 的研究设计
设计不好 = 结果不好
判断
Agent 的话题命名合理吗?
因果还是相关?
遗漏了什么?
负责
对结果真实性负责
对幻觉和偏见保持警觉
对决策后果承担责任

AI 让分析更快,但让人的责任更重——Agent 出一版"完美"报告只要 5 分钟,但你要花 50 分钟检查它遗漏了什么。

课堂讨论

在你的工作场景里:

1. 你手上有哪类文本数据?让 Agent 帮你分析,你会怎么写指令?
2. Agent 发现的话题你不认同,怎么办?听 AI 的还是听自己的?
3. 你的领域对 AI 分析的信任度如何?需要什么额外验证?
4. 用 OpenClaw 试一下:上传数据 → 让 Agent 分析 → 抽检结果

动手练习
用 OpenClaw 分析课堂数据,两种 Prompt 对比一致性
进阶挑战
让 Agent 对自己的输出做验证,记录抽检准确率

Prompt 是代码
Agent 是工具
你是研究者

一句话就能做主题分析
但好结果 = 好 Prompt + 严验证 + 深判断

AI 越强大,人的判断越不可替代

All models are wrong, but some are useful — 人来决定哪个有用