| 层 | 不确定性来源 | 研究者可控? | 本讲落点 |
|---|---|---|---|
| 模型内部 | 黑箱机制、思维 token | ✗ | 外部验证兜底(见「验证样本的两个用途」) |
| 训练数据 | ✗ | 训练泄漏(见该节) | |
| 生成配置 | 提示词、温度、top- |
✓ 部分 | 提示词与校验(见提示词工程与最低校验配置) |
三条推论:
作者的判断:现有的评测方法对"造更好的模型"极其有效,但对"某个 LLM 在你的新任务上会表现如何"几乎没有指导意义。
两个理由:
对金融研究的三条含义:
| 例 1:国会法案 | 例 2:金融新闻头条(与主轴案例同源) | |
|---|---|---|
| 文本 |
法案描述 | 标题:"BNY Mellon Q1 EPS $0.94 Misses…" |
| 结果 |
法案是否通过本院 | 发布后某窗口的已实现收益 |
| 协变量 |
提案人党派、投票分数 | 公司历史基本面 |
| 经济概念 |
法案政策主题 | 该标题对公司是正面/负面/中性 |
三个记号(本讲后续都用):
关键提醒:
="这条新闻是正面还是负面"——看似简单、实则口径依赖(谁定义正面?按什么窗口?)。口径写不清,后面的回归系数就没有意义。
你的研究属于哪一类?
│
┌─────────────────────┴─────────────────────┐
▼ ▼
① 预测 Prediction ② 估计 Estimation
文本 r → 预测结果 Y_r 文本 → 度量概念 V_r → 估参数
例:财报电话会 → 股价 例:标题 → 情绪 → 回归收益
唯一条件:无训练泄漏
必须有:验证样本
不满足:样本平均损失低估真实误差
不满足:系数量级/显著性
——"回测很准"其实是记住了历史 甚至**符号**都可能错
| 预测问题 | 估计问题 | |
|---|---|---|
| 交付什么 | 一个预测 |
一个下游参数 |
| 主要威胁 | 训练泄漏——模型见过你的测试样本 | 测量误差——LLM 标注 ≠ 专家标注 |
| 解法 | 设计上机械排除 | 小验证样本+纠偏公式(见该节) |
| 金融典型 | 用新闻预测收益、用电话会预测盈余 | 造情绪/不确定性/相似度指标再回归 |
本课定位:"评估集+LLM-as-Judge"属预测侧评测;Part 4"防泄漏/walk-forward"与本节同源。而估计问题在金融实证里更常见("用 LLM 造指标再回归"),本课此前未展开——下文补齐。
唯一条件:无训练泄漏——研究者样本与 LLM 训练数据不得重叠。
作者把它写成"遗漏变量偏误":泄漏项衡量的是——
"得知某条文本被你抽进了样本"这件事,会多大程度更新你对'它是否在 LLM 训练数据里'的信念?
当样本内的文本更可能出现在训练数据中、且模型恰在这些文本上表现好时,偏误项为正 →样本平均损失高估了真实预测能力。
含义:"不知道训练数据里有什么"本身就是偏误来源——与测试集看着是否公平无关。
论文的证据(不止计算机领域,经济数据同样中招):
场景:用未来的金融新闻头条预测股票收益。
错误做法:拿 2024 年头条做评估,却用训练数据覆盖到 2025 年的模型——泄漏项几乎必然为正:你和厂商都"看过"2024 年的新闻,任何"预测成功"都可能是背出来的。
正确做法(按设计机械排除):用开源、权重固定公开发布的模型(Llama/BLOOM/OLMo),或训练数据带时间戳的模型;评估样本只取发布晚于模型发布/截止日
为什么闭源模型做不到:训练数据不公开且可能被持续微调;把测试数据发给闭源 API 本身有风险(可能进入后续微调);有研究估计数百个基准可能已通过 API 泄漏、并质疑其公开"知识截止日"是否可信;最值得警惕:同一提示词提交 GPT-4o 结果逐月变化而无公开变更公告。
三种可信的"零泄漏"情形:① 预测未来文档(用早于该日期的权重);② 预测从未公开的保密文档;③ 从已知完整语料中随机抽样。
重要否证:提示词补救无效——"请忽略日期
之后的信息"这类指令不是泄漏的可靠解法。
插值(plug-in)估计的强假设:LLM 必须处处复现既有度量
偏误长什么样(线性回归,命题 3):记 LLM 误差
2019 年、6,000 只股票的新闻头条;5 个模型(GPT-3.5-Turbo/4o/4o-mini/5-mini/5-nano)× 9 种提示词。
发布后 1/5/10 日已实现收益对有正/负面标签回归,控制报告量级与前滞收益(标准误按日期与公司聚类)。
→ 结论:仅换模型或提示词,估计的方向与量级就明显不同,且哪两种提示策略更一致没有稳定规律。
思路(借自老计量经济学:Bound & Krueger 1991;Bound et al. 1994):在随机抽取的一小部分文本上,用原度量程序
纠偏公式(经济概念作因变量):
实现只要两步:① 主样本:
对 回归 → ;② 验证样本:误差对 回归 → ;③ 相减(推断用 bootstrap)。
用途一 · 选型:对每个"模型 × 提示词"组合估计偏误
用途二 · 纠偏:把
作者的结论(值得逐条记):
对金融研究的直接含义:用 LLM 造情绪/不确定性指标时,不要只报"与人工标注一致率";应当留出验证样本,报纠偏后的系数与区间。
路线一:宣称"输出没有误差"从而正当地插值——很难辩护:既要解释为何 LLM 在你任务上精确复现概念,又要解释为何它在基准上并不完美、那些脆弱性证据为何不适用于你。
路线二:给误差写个统计模型,再照搬测量误差文献的解法
常见设想是"不同提示策略的误差相互独立"→ 于是想用一个提示词给另一个提示词做工具变量。但:
陷阱三:把"真值"定义成"LLM 的输出本身"
当概念过于主观时,有人干脆把研究对象定义为"GPT-4o 用某提示词产出的东西"——这样插值估计按定义就有效。但:换提示词要不要再发一篇?GPT-6 出来要不要重做所有用 GPT-5 的论文? 若 60% 的"模型×提示词"组合给正相关、40% 给负相关,我们学到了什么?
作者态度:我们关心的是底层经济概念,不是 LLM 的输出。面对歧义应承认并从多角度探测,而非把某一种操作化奉为正统。实践答案很清楚:花力气收集一个小验证样本。
① 人类受试模拟(in-silico subjects):把文本
② 假设生成:用 LLM 提出研究假设(建议工具变量、生成可解释假设等)——仍落在框架内,同样需要验证,而非"看着有新意就采信"。
金融落点:用 LLM 模拟储户挤兑、投资者反应、通胀预期(本讲 Part 4 的顶刊文献正是这类研究)——它们全部属于估计问题,因此全部需要验证样本:至少一部分真人/真实市场反应。
| # | 步骤 | 具体要写清什么 |
|---|---|---|
| 1 | 先判定问题类型 | 是预测(用文本预测 |
| 2 | 预测:确保无训练泄漏 | 三者须明确:①目标总体?②抽样程序?③它与可能的训练语料什么关系? |
| 3 | 估计问题:收集验证样本 | 随机抽一部分文本,用原度量程序 |
| 4 | 报告纪律 | 报纠偏后系数与区间;说明模型版本、提示词、验证样本大小 |
作者对模型选择的明确建议(与直觉相反,务必讲给金融学生):
"研究者应避免依赖闭源模型(OpenAI 的 GPT 系、Anthropic 的 Claude 系)"——因为其训练数据不公开、且可能被持续更新。
首选:开源+权重公开(或训练数据有文档)的模型,并配合按设计排除训练数据的评估样本。
与本课的关系:本页 4 步是「最低校验配置」与「评估集+LLM-as-Judge」的计量学版本——它回答为什么必须这么做与偏误怎么算。
四大场景:金融分析(财报/研报/预测)|智能助手(投顾对话/政策解读)|数据处理(清洗/标注/ETL)|学术研究(文本测度/假设生成)
三大局限与对策(细节归档附录):
| 局限 | 表现 | 对策(本讲落点) |
|---|---|---|
| 幻觉 | 虚构数字/事件/法规 | 检索+工具+规则+人工(Part 3 合规层) |
| 时效 | 知识截止于训练日 | RAG 接实时数据(见 RAG 技术前奏与知识库层实现) |
| 数值不稳 | 复杂计算出错 | 计算交给工具库纯函数(见工具库层实现) |
注:GPT-4 技术报告原文并无金融特定论述,此为课堂归纳。
来源:Wu et al. "BloombergGPT", arXiv:2303.17564(检索 2026-09-28)
Agent 定义 → Harness 工程与七子系统 → 判据与实例 → 认知架构(机制+解剖视角)
→ 设计维度 → 五协作模式 → 工具接入生态 → 框架与运行时选型
→ 工程防护 → 效率(成功任务成本) → 收敛与可验证性缺口 → 前沿争议
本 Part 回答两个问题:Agent 与 Harness 是什么;怎么设计、怎么控本、边界在哪。
LLM 的四局限 → Agent 的四能力:
| LLM 局限 | Agent 补什么 |
|---|---|
| 单轮对话、无持续性 | 状态与记忆(会话/检查点) |
| 无法执行操作 | 工具调用(函数/检索/代码执行) |
| 知识截止于训练时间 | 知识库+数据接口(RAG/实时数据) |
| 不能验证与迭代 | 循环(ReAct/反思)+评估 |
Agent = 模型 + Harness——模型提供智能,Harness 把智能变成工作。
| 维度 | 内容 |
|---|---|
| 定义 | Harness(运行时/runtime):把 LLM 与世界耦合起来的运行时层——经由循环(loop)、工具(tools)、上下文管理(context)、安全控制(safety)、编排(orchestration)、扩展面(extension) |
| 学科 | harness engineering 于 2026 年初被命名为一门学科:已有从业者指南、形式化定义、自动演化系统与自己的 arXiv 谱系 |
| 边界 | Harness 不是模型、不是提示词模板集合、不是某一个框架——它是运行时本身(见七个规范子系统) |
为什么它是本讲的真正主角——三篇论文从不同角度得出的同一判断:
| 来源 | 原文判断 |
|---|---|
| arXiv:2609.00006 §1 | 模型提供智能,harness 把它变成工作;harness engineering = 这个运行时的设计与演化 |
| arXiv:2608.23953 摘要 | "约束 Agent 行为的是这一层,而不是它包裹的模型"(the binding constraint on agent behaviour) |
| arXiv:2608.25593 摘要 | harness 可以盖过基座模型的贡献(can dominate the contribution of the underlying foundation model) |
对金融的三句话落点:① 模型可以换(见按任务选模型);② Harness 决定可控性(护栏、检查点、人在环都在这一层);③ Harness 决定"每次成功任务的成本"(效率:按「成功任务成本」计价)。
与本讲既有内容的关系:Part 1 讲模型(可替换的一半),Part 2 讲 Harness(本讲主体),Part 3 把 Harness 落到财报解读案例的代码里。
来源:arXiv:2609.00006 §2.3/Table 1(11+1 个生产级 harness 源码解剖,约 400 万行;检索 2026-09-29)。任何 harness 都须在这七项上表态——哪怕表态是"故意不做"(Aider 即不做编排)。
| # | 子系统 | 职责 |
|---|---|---|
| 1 | Agent loop | 推理与动作交替;停止条件与失败恢复 |
| 2 | LLM integration | 说厂商协议;组装 prompt;缓存/思考/路由 |
| 3 | Tools & actions | 定义并执行 Agent 能做什么 |
| 4 | Memory & context | 配给上下文窗口;跨轮次/跨会话持久化 |
两个横切面(不单列为子系统):界面层(TUI/CLI/IDE 协议/HTTP server/SDK)|会话基座(transcript、持久化、resume/fork)
| # | 子系统 | 职责 | 「最小→最大」实现(语料观测) |
|---|---|---|---|
| 5 | Safety & permissions | 决定什么能跑、什么要问、什么禁止;隔离执行 | 步数上限 → 策略规则+LLM 审批复核器+三平台 OS 沙箱(Codex) |
| 6 | Orchestration | 派生与协调子 Agent;连接其他 Agent | Aider 故意不做 → 递归组合(Claude Code)/跨厂商协调(Omnigent,元层) |
| 7 | Extensibility | 让用户与生态加能力:配置/钩子/Skills/插件/MCP | 结构化类型(Python Protocol) → 一切皆扩展的运行时(Pi)/插件市场(Codex) |
两条读表结论(出处同前页):① 最小实现极低——Mini-SWE-Agent 约 100 行实现全部七子系统,SWE-bench Verified 自报成绩与三个数量级更大的系统同区间;② 编排的最小形态是"故意缺席"——Aider 坚持单 Agent,为"不要为多 Agent 而多 Agent"提供实证背书。
适用范围:编码 Agent 语料的实证解剖,非金融定理;金融差异见可验证性缺口。课堂动作:把主轴案例的八节点映射到这张表(答案见「编排子系统实现」)。
| 维度 | Workflow(确定性管道) | Agent(自适应系统) |
|---|---|---|
| 状态管理 | 预定义条件(if-else) | LLM 推理动态决定 |
| 决策机制 | 编译时确定 | 运行时生成 |
| 错误处理 | 静态重试 | 自我诊断+策略调整 |
判断标准(三行判别式):
金融实务倾向先 Workflow、后局部 Agent 化——可控性优先(见三元权衡)。
FinRpt-Gen(Workflow 型):9 个 Agent 节点、固定流水线(抽取→分析→预测→Judge),价值在"分工"而非"决策"。
AI Scientist-v2(Agent 型):含 Debug Loop——运行失败→读 traceback→自主修正→重试(论文标题即 "Workshop-Level Automated Scientific Discovery",arXiv:2504.08066)。
代码生成 → 执行 → [失败?] ──否──→ 进入下一阶段
↓ 是
读 Traceback → 调整策略重试(最多 N 次)
同一个"研报生成"任务:固定标的+固定模板 = Workflow;开放选题+自主探索 = Agent。判据是决策点在编译期还是运行期。
对齐 Google Agents 白皮书三层(Orchestration / Memory / Tools),机制视角看运行时怎么协作:
| 机制 | 一句话 | 主轴案例落点 |
|---|---|---|
| 规划(Planning) | 把目标拆成步骤并推进 | "财报问答→指标→报告"的任务链 |
| 记忆(Memory) | 短期状态+长期知识 | 会话中记住"已读报表、已算指标" |
| 工具(Tools) | 调用外部函数与环境 | 数据抓取、指标计算、合规规则 |
| 协作(Collaboration) | 多角色/多体分工 | 数据/解析/分析/合规四角色 |
下一页用解剖视角看同一件事(组件有哪些),两视角互补。
来源:Google, "Agents" Whitepaper(撰写当日复核链接;检索 2026-09-28)
分层图见下一页(单独成页,避免拥挤);本页给出要点与术语口径。
AI Agent = 模型底座 + Harness(模型之外的运行时)+ 知识库 + 工具库 + 数据接口 + Skills(本课教学解剖框架,非行业标准命名)
AI Agent = 模型底座 + Harness(模型之外的运行时)+ 知识库 + 工具库 + 数据接口 + Skills(本课教学解剖框架,非行业标准命名)
┌─────────────── 用户 / 运营者 ───────────────┐
│ ▲ 人在环 ─ 确认/干预 │
┌───────────┴────────────┐ │ │
│ Harness(运行时) │◀─────┴── 护栏(guardrails) │
│ ①循环 ⑤安全 ⑥编排 ⑦扩展 │──────▶ 可观测(追踪/日志) │
│ +横切:会话基座/界面层 │ │
└───┬────────┬────────┬──┘ │
│ │ │ │
知识库(KB) 工具库(Tools) 数据接口(Data) │
事实/文档 怎么算/怎么做 当前值/端点 │
(RAG) (纯函数/脚本) (AkShare/EDGAR/FRED) │
│ │ │ │
┌───┴────────┴────────┴────────────────────┐ │
│ Skills 层:可复用技能包(提示词+脚本+校验) │ │
└──────────────────────────────────────────┘ │
模型底座(LLM:开源/闭源/本地)◀── 函数调用/结构化输出
读图三条:① 模型底座在最下,可替换;② Harness 居中调度(循环/状态记忆/护栏/协议/可观测),记忆与护栏不单列为平级组件;③ 判定口诀:知识库=有什么事实|数据接口=当前值是什么|工具库=怎么算/怎么做。
两种粒度互补:本页是分层视图(整个系统怎么摆),前一页是解剖视图(模型之外的运行时由什么组成)——考试与分析题要求能自由切换两种粒度。
通用 harness 已经商品化;垂直智能体的价值全部落在这四件套上。
通用 Agent 运行时 / Harness(循环·编排·安全·会话·扩展 —— 别在这里创新)
▲ ▲ ▲ ▲
┌────┴────┐ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│本地知识库│ │ 数据接口 │ │ skill 库│ │ 脚本库 │
│ 私有事实 │ │ 当前值 │ │ 怎么做 │ │ 怎么算 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
└────────── 领域能力积累在这里 ──────────┘
| 件 | 判据 | 内容物 |
|---|---|---|
| 本地知识库 | 有什么事实 | 年报/公告/合同、监管条文、口径手册;向量库、图谱 |
| 数据接口 | 当前值是什么 | 行情、三表、宏观;连接器+缓存+限流+降级 |
| skill 库 | 怎么做 | 角色提示、步骤编排、输出 schema、自检清单 |
| 脚本库 | 怎么算 | 指标纯函数、口径转换、对账断言;确定性、可单测 |
纪律 1 · 通用层不要自研。 循环、重试、压缩、沙箱、会话记录——用成熟 harness。证据:11 个生产 harness 无一处 import 通用框架(约 400 万行),循环这一层已无人竞争(pi 796 行/dsh 515 行)。预算全投四件套。
纪律 2 · 知识与算力分离。 模型只做"理解与生成",任何数字都出自脚本库——可审计、可复现、可单测。
纪律 3 · 四件套都要可版本化。
| 件 | 版本化对象 | 缺了会怎样 |
|---|---|---|
| 本地知识库 | 语料版本+切分参数 | 同一问题两次回答不一致 |
| 数据接口 | 缓存快照(as-of 时点) | 无法复现历史结论 |
| skill 库 | 提示词与输出 schema 版本 | 输出漂移无人察觉 |
| 脚本库 | 单测+口径注释 | 口径悄悄变化,数字不可比 |
| 模式 | 思路 | 适用 | 案例落点 |
|---|---|---|---|
| ReAct | Thought→Action→Observation 交替推进 | 探索性问题 | 财报问答:先查报表再回答 |
| Plan-and-Execute | 先整体计划,再逐步执行 | 任务结构清晰 | 研报生成:计划→抓数→分析→成稿 |
| 反思(Reflection) | 执行后自评、修正 | 质量要求高 | 合规自检、指标口径复核 |
来源:Yao et al. arXiv:2210.03629;Anthropic 工程博客(检索 2026-09-28)
记忆是"知识截止"的第二道解药:模型忘了没关系,记忆系统记得。
{"name": "get_financial_statements", "description": "获取指定股票指定期间财务报表",
"parameters": {"symbol": "600519", "statement": "资产负债表", "period": "2025年报"}}
工具描述写得好,模型才"会用"——描述是 prompt 工程的一部分(提示词工程技巧在此复用)。
为什么拆多体(认知负荷分解):
| 优势 | 说明 | 案例 |
|---|---|---|
| 认知分工 | 每个 Agent 只装有限上下文 | TSci 四角色流水线 |
| 并行处理 | 子任务同时推进 | 数据抓取与模板准备并行 |
| 故障隔离 | 单点失败不拖垮全局 | 合规 Agent 独立于生成 Agent |
三种编排形态:Sequential(依赖链)/ Parallel(多视角)/ Hierarchical(分层指挥)
自治性 Autonomy
▲
/|\
/ | \
/ | \
▼ ▼ ▼
可控性 Control 可观测性 Observability
| 场景 | 倾向 |
|---|---|
| 合规量化交易 | 高可控+高可观测,低自治 |
| 科研探索(选题/假设) | 高自治,预算护栏兜底 |
| 研报生成(半自动) | 中间态:流水线+人审 |
核心思想:角色化(role)+ 任务书(task)+ 接口契约(schema)+ 质量网关(检查点)
| TSci 角色 | 职责 | 输出 |
|---|---|---|
| Curator | 数据清洗、特征工程 | 标准化时序数据 |
| Planner | 基于特征选模型 | 模型配置 |
| Forecaster | 执行预测 | 数值+置信区间 |
| Reporter | 可解释报告 | 结构化文档 |
DeepAnalyze-8B 的五动作 Token(arXiv:2510.16872,自主数据科学模型):
| Token | 功能 |
|---|---|
| ⟨Analyze⟩ | 规划、推理、反思 |
| ⟨Understand⟩ | 结构化数据理解 |
| ⟨Code⟩ | Python 代码生成 |
| ⟨Execute⟩ | 环境执行+反馈 |
| ⟨Answer⟩ | 最终输出 |
nfails(执行失败上限)、nrounds(消息上限,默认 500);timeout 出自代码配置通用价值:对抗式自检是降低幻觉与不一致性的有效机制。
Model Context Protocol——Agent 与工具/数据的标准接口:
┌────────────┐ JSON-RPC 2.0 ┌──────────────┐
│ MCP Client │ ←──────────────→ │ MCP Server │
│ (Harness) │ tools/resources │ (数据/工具) │
└────────────┘ prompts └──────────────┘
.agents/skills/ 路径跨厂商趋同,出现注册表、信任分级,以及语料中首批由 Agent 自己编写的技能Agent-to-Agent——Agent 之间如何协作:
┌──────────┐ A2A 协议(HTTP/JSON) ┌──────────┐
│ Agent A │ ←────────────────────→ │ Agent B │
└──────────┘ Agent Card 发现 └──────────┘
| 流派 | Harness 风格 | 代表(2026-09 版本) |
|---|---|---|
| A. 严谨编排派 | 显式状态图/状态机,可审计可回滚 | LangGraph 1.2.12 |
| B. 角色流水线派 | 角色+任务书,SOP 驱动 | CrewAI 1.15.22、AG2 1.1.0 |
| C. 轻量运行时派 | 极简 ReAct/代码执行循环 | OpenAI Agents SDK 0.22.x、smolagents 1.26.0、PydanticAI 2.51.0、Agno 3.0.11 |
| D. 数据/RAG 派+平台派 | 数据工作流/可视化编排 | LlamaIndex 0.14.25|Dify 1.17.x、n8n 2.40.x |
流派本质 = Harness 设计风格(七个规范子系统的落地分类):图式/角色/轻量/平台——选型先认风格,再认框架(版本与检索日期撰写当日复核)。
| 框架 | 版本 | 一句话定位 |
|---|---|---|
| LangGraph | 1.2.12 | 图/状态机式低层编排;长程有状态 agent;节点/边/检查点/中断(本讲主轴) |
| AG2 | 1.1.0 | AutoGen 继任;v1.0 起协议驱动重写(import ag2),经典 API 迁至 ag2-classic(官方文档确认) |
| CrewAI | 1.15.22 | 角色化 crew 协作编排;含 Skills 概念(docs.crewai.com) |
| LlamaIndex | 0.14.25 | 数据/RAG 框架;Workflows 与 AgentWorkflow 提供 agent 能力 |
安装示例:pip install "langgraph>=1.2"、pip install ag2 crewai llama-index(版本以 PyPI 为准)
| 框架 | 版本 | 一句话定位 |
|---|---|---|
| OpenAI Agents SDK | 0.22.x | 轻量运行时:handoffs/guardrails/sessions |
| PydanticAI | 2.51.0 | 类型安全、结构化输出优先(2026-09-25 发布,GitHub release) |
| smolagents | 1.26.0 | HF 极简"代码执行式"(CodeAgent) |
| Agno | 3.0.11 | 原 phiData(2.7.10 后停更)更名而来(官方迁移文档) |
| Dify | 1.17.x | 可视化 LLMOps/Agent 平台,可自托管 |
| n8n | 2.40.x | 自托管工作流自动化(含 AI/LangChain 节点) |
2026 新项目:
dsh-jsonrpc-agent(无人值守 SDK 组合,非 CLI 交互模式)pi-agents 0.21.0(2026-08-29,Apache-2.0,工作流编排扩展:sequence/parallel/map/loop/switch+maxAgents/maxCost 预算)pi-agents 0.21.0,2026-08-29,Apache-2.0;支持 sequence/parallel/map/loop/switch 与 maxAgents/maxCost 预算;下载量级小,生态早期)选型纪律:新不等于好——课程与作业的主轴框架选 LangGraph(成熟、显式可控);新丁进速览与前沿观察,不作作业默认。
第 0 问(自己写循环 vs 用框架)已独立成页——它是选型的第一步,且证据量较大。
任务容错率如何?
├─ 低容错(金融)→ 流程确定? → 确定: LangGraph / CrewAI(显式图/流水线)
│ → 需适应: LangGraph + 护栏 + 人在环
└─ 高容错(研究/探索)→ 需要多大自主性?
├─ 强自主: OpenAI Agents SDK / smolagents / Pi
└─ 可控自治: LangGraph 子图 + 预算护栏
数据密集(RAG 为主)→ LlamaIndex;非技术团队/可视化 → Dify / n8n
工程语言偏好:Python → 上述全部;TypeScript → LangGraph.js / DeepSeek Harness(preview)
决策树的应用例:
| 金融场景 | 推荐 | 理由 |
|---|---|---|
| 财报 RAG 问答 | LlamaIndex(AgentWorkflow) | 数据/RAG 原生 |
| 研报流水线 | CrewAI / AG2,或 LangGraph | 角色分工成熟;要审计则选后者 |
| 量化研究 Agent | LangGraph + PydanticAI | 显式可控+类型安全 |
| 合规客服/话术 | LangGraph + guardrails | 状态机+护栏契合 |
| 最快原型 | OpenAI Agents SDK / smolagents | 轻量起步 |
| 可视化管理 | Dify(自托管) | 低代码+LLMOps |
| 跨系统自动化 | n8n | 工作流节点丰富 |
第 0 问(必须先答):自己写循环,还是用框架?
实证背景:约 400 万行 Python/TypeScript/Rust 的 11 个生产级编码 harness 中,无一处导入通用 Agent 框架——LangChain、LangGraph、LlamaIndex、AutoGen、CrewAI、PydanticAI、Genkit、Google ADK 全部零命中;Gemini CLI 连 Google 自家的 Genkit/ADK 都不用。它们全部手写异步循环+确定性检索(ripgrep、tree-sitter、glob、自动发现的 Markdown 上下文)。
但边界要说清(否则会误读成"框架无用"):① Aider 有一个可选的 llama-index extra,仅对它自己的文档做 doc-RAG,不是 agent loop 编排;② OpenCode 把内层 LLM/工具管线委托给 Vercel AI SDK(provider 抽象层,非编排框架);③ 生产 harness 面对的是代码检索,而金融文本是非结构化语义检索,RAG 仍然必要(见「知识库层实现」)。
判据:
| 情形 | 选择 | 理由 |
|---|---|---|
| 要审计/复核/教学透明、状态图要能画出来 | 用框架(本课选 LangGraph) | 显式状态、检查点、可读性;治理成本低 |
| 团队要长期自研、要榨性能、要接多个异构 harness | 手写循环 | 生产实践的选择;框架的抽象会成为天花板 |
| 只是做原型/验证想法 | 用轻量框架或轻量运行时 | 起步快 |
| 需要可外部校验的审计记录(可验证性缺口) | 无论哪条路,都要自己补 | 现成 harness 全部没有 |
| 金融场景 | 推荐框架 | 理由 |
|---|---|---|
| 财报 RAG 问答 | LlamaIndex(AgentWorkflow) | 数据/RAG 原生 |
| 研报流水线 | CrewAI / AG2 | 角色分工成熟 |
| 量化研究 Agent | LangGraph + PydanticAI | 显式可控+类型安全 |
| 合规客服/话术 | LangGraph + guardrails | 状态机+护栏契合 |
| 最快原型 | OpenAI Agents SDK / smolagents | 轻量起步 |
| 可视化管理 | Dify(自托管) | 低代码+LLMOps |
| 跨系统自动化 | n8n | 工作流节点丰富 |
三个场景,选一个框架并说出理由:
理由比框架重要:先答"是什么流派/Harness 风格",再答"具体框架"。
nfails/nrounds/timeout 类硬上限(Denario 配置口径:nfails、nrounds 默认 500);成本要按"每次成功任务"计量(见效率:按「成功任务成本」计价),不是按 token 数通用对策:预算上限(按成功任务成本)、超时熔断、输出 schema 校验、关键事实强制检索、输入缺陷前置检查(范围与假设先澄清)。
终端指标换掉:Agent 效率 = cost per successful task(每次成功任务的成本,由 Agent 轨迹诱发);
token 与缓存计数是轨迹的测量值,不是充分的优化目标。
① harness 对成本的影响,大于提示词(同模型/同任务/同提示词,匹配单元对比):
| 观测项 | Claude Code | PI.DEV |
|---|---|---|
| 固定前缀(transmitted fixed prefix) | 12–15× 于对方 | 基准 |
| 轮次 | 2–7×(10–41 轮) | 5–7 轮 |
| 每次成功成本 | 5–30× | 基准 |
| 成功率 | ≈100%(相当) | ≈100% |
| 工具画像 | 约一半调用是测试执行(验证重) | 22% |
② 本课自家 harness 的预注册实测(DeepSeek Harness 0.1.0rc7、dsh-jsonrpc-agent 无人值守组合、模型固定 Claude Sonnet 5、5 任务×5 臂×3 重复=75 次有效运行、全部臂全解):
| 臂 | 平均计费成本 | 相对 baseline |
|---|---|---|
| baseline(保持出厂行为) | $0.2753 | — |
| policy(效率策略附到 system persona) | $0.2114 | −23.2% |
| rewrite(wrapper 提示纠正) | $0.2109 | −23.4% |
| effort(自适应覆盖 reasoningEffort) | $0.0696 | −74.7% |
| full(三者叠加) | $0.0490 | −82.2% |
金融落点:预算熔断应管每次成功任务的成本(成功率与成本同时约束);按任务选模型页的批量/低成本档也要用这个口径核算。
四条限定(必须连同数字一起讲):①版本 0.1.0rc7、被测组合为无人值守 SDK 组合(非 CLI);②模型是 Claude Sonnet 5,未测 DeepSeek 模型;③5 个激活夹具全部为成功率封顶(ceiling)任务,因此证明的是"该配置下算力过度配置",不是难任务上的最优 effort 策略;④dsh 与 Claude Code 的绝对成本不可直接比较(prompt/工具/压缩/缓存流量均不同)。
class CircuitBreaker: # 通用工程模式(课堂示例,非论文内容)
def __init__(self, failure_threshold=5, timeout=60):
self.failure_count, self.state = 0, "CLOSED"
self.timeout, self.threshold = timeout, failure_threshold
def call(self, func, *args):
if self.state == "OPEN" and not self._cooled_down():
raise CircuitBreakerOpen()
try:
result = func(*args); self.failure_count = 0; self.state = "CLOSED"
return result
except Exception:
self.failure_count += 1
if self.failure_count >= self.threshold: self.state = "OPEN"
raise
def _cooled_down(self):
return False # 简化示意:真实实现记录时间戳并支持 HALF_OPEN 试探
金融落点:行情接口抖动、模型 API 超时——熔断降级(返回缓存/报错)而不是堆重试。
| 层级 | 指标示例 | 采集方式 |
|---|---|---|
| 系统级 | 延迟、错误率、资源 | Prometheus/Grafana 类 |
| Agent 级 | 决策质量、工具使用率 | 自定义埋点 |
| 业务级 | 任务完成率、成本 | 业务系统 |
金融运维格言:不可观测的 Agent 不可上线——审计回放依赖的就是状态与追踪(见金融风控与合规治理)。
但"可观测"≠"可验证":三个生产级 harness 都有可观测、都没有可被外部方独立校验的记录(见可验证性缺口)。可观测是"你自己能看",可验证是"别人不用信你也能查"——金融场景要的是后者。
三个哲学对立的 harness,收敛到同一个中间形态(deepagents:电池全含|pi:极端极简|dsh:一切皆插件):
| # | 收敛要素 | 语料证据(三种实现) |
|---|---|---|
| 1 | 商品化的循环 | pi 的 loop 文件 796 行;dsh 的 driver 515 行;deepagents 不自己写循环(委托 LangGraph)——没有一家在循环上竞争 |
| 2 | 只追加、可重放的会话记录 | 强度排序:dsh 强(事件溯源+运行时"可见 ⇒ 已记录"断言+replace 操作)> pi 中(追加条目+寄存器)> deepagents 弱(恢复仍改写历史) |
| 3 | 模型怪癖外置为数据 | da:profile 类层次|pi:compat 数据目录|dsh:adapter 配置+运行时能力解析 |
| 4 | 上下文的渐进披露 | da:skills 索引(name/desc/path)|dsh:投影+每个能力的 token/KV 契约 |
| 5 | 正交扩展缝 | da:middleware/backend/profile|dsh:service-definition 三元组 locator |
未收敛的维度:OS 级沙箱——dsh 有(bwrap/Landlock,且失败时抛错而非降级)、deepagents 部分、pi 故意不做("把自己容器化")
可验证性缺口(本页高潮)——三个 harness 全部为零:
| 层级 | 内容 | 现状 |
|---|---|---|
| 运维可重建 | 运行时自己能否重建发生了什么 | dsh 达到(最强),但其文档坦白边界:ctx.tools.restrict() 是"一种可见性组合,不是权限边界" |
| 外部可校验 | 外部方无需信任运行时即可校验的、防篡改的记录 | 三个 harness 全部为零 |
| 领域溯源 | 数据截止到何时(as-of)/结果能否出域/成本上限是否守住了 | 无人触及 |
作者的解读(也是本课的用法):这是预测性缺口,不是疏忽——三个 harness 收敛于"终端前开发者所需的一切",而可验证性恰是该受众不需要的,所以收敛在此停止;于是它成为provenance 不可选的领域(金融/合规/医疗)的下一个竞争轴。
金融落点(本讲最强的一句):本讲反复强调的"可解释、可审计、人在环、审计回放",在 2026 年的生产级 harness 里是空白——小组项目若做"可外部校验的金融 Agent 审计记录"(小组项目选题 E),做的不是课程练习,而是前沿缺口。
三种立场,来自三篇论文:
| 立场 | 来源 | 主张与证据 |
|---|---|---|
| A 设计 | arXiv:2609.00006 | 90 行最小可用 harness(scaffold)+18 条设计建议+29 个可复用设计模式——harness 是工程制品 |
| B 收敛 | arXiv:2608.23953 | 中间形态已稳定(收敛五要素);差异化不发生在五要素里,而发生在边界(可验证性缺口) |
| C 生成 | arXiv:2608.25593 | 把 harness 形式化为可组合、可机器生成的产物,受固定四模块协议治理;JIT-Agent 为任意现成 agentic LLM 即时合成任务自适应 harness、修复 harness、并从配置档案中自演化 |
立场 C 的成绩单(论文自报,未经本课独立复现):
| 观测 | 结果 |
|---|---|
| DeepSeek-V4-Flash + JIT-Agent | DeepSearchQA 超过 GPT-5.6(+9.1) |
| 同前 | OdysseyBench +4.3 |
| GLM-5.2 + JIT-Agent | 最高 +20.2 分 |
| JIT-Agent 生成的 harness | 性能与 OpenCode、Claude Code 等成熟运行时相当 |
| 跨模型族 | DeepSeek V4 / Mimo-V2.5 / Qwen3.6 一致改善 |
| 定位 | 首个为即时 harness 生成而造的模型;"harness 智能"是可训练、可迁移、可复利的维度,与模型规模化正交 |
本课立场(要讲明):即便 harness 可以被生成,金融场景仍要求有人能说清"为什么是这个 harness"——可解释、可审计、可治理的前提是设计者理解设计。这正是合规边界与可验证性缺口的交集。
课堂讨论(可作讨论题 6):如果 harness 能自动生成,投研 Agent 的"设计文档"还有价值吗?谁为它的行为负责?
本组各页是主流 harness 的横向速览(对应开源框架全景与选型决策树两页);逐系统细节见 arXiv:2609.00006。
harness ≠ 框架。框架是你 import 的库;harness 是能直接跑起来的运行时。以下来自 11+1 个编码 harness 的源码级横断解剖(arXiv:2609.00006,约 400 万行)。
| 系统 | 厂商 | 语言·规模 | 签名能力(论文口径) |
|---|---|---|---|
| Claude Code | Anthropic | TS · ~500K+ | 延迟工具加载;prompt-cache 共享 fork;"别人抄的参照物" |
| Codex CLI | OpenAI | Rust · ~1.1M | Agent 自维护跨会话记忆;工具调用即 V8 执行的代码 |
| Gemini CLI | TS · ~600K+ | 模型路由当运行时调度;语料中唯一 A2A 服务器 |
| 系统 | 语言·规模 | 签名能力(论文口径) |
|---|---|---|
| Mistral Vibe | Python · 20–40K | 中间件管线式循环;把 rewind 暴露到 ACP 上 |
| OpenHands | Python · 80–110K | 资源锁定的并行工具;可把对手 harness 当 ACP 后端托管 |
| Aider | Python · 20–40K | 13 种多态编辑格式;语料中唯一带排序的 repo map |
| Mini-SWE-Agent | Python · ~5K | 约 100 行的下限:七子系统全有,全是极简实现 |
| 系统 | 语言·规模 | 签名能力(论文口径) |
|---|---|---|
| Hermes | Python · ~600K+ | 自改进 skill 循环;lineage compaction;verify-on-stop |
| Pi | TS · 80–110K | 一切皆扩展的核心;会话树版本控制 |
| OpenCode | TS · ~500K+ | 客户端/服务器式 harness;语法感知的命令权限 |
| OpenClaw | TS · ~500K+ | 网关式委派;回复前跑 Active-Memory 子 Agent(非 SWE 对照) |
结论 1 · 循环已经不竞争了。 pi 的 loop 796 行、dsh 的 driver 515 行、deepagents 干脆不自建循环(委托 LangGraph)——没有一家靠循环做出差异;差异发生在扩展面、安全与会话记录。→ 支撑"垂直领域智能体=四件套"。
结论 2 · 市场已完成"工具 → 平台"转向(2026 上半年)。
结论 3 · 扩展标准已分出胜负。 SKILL.md 技能包 9/11 领先 MCP 8/11;ACP 6 个系统,并长出第三角色 "harness hosting"(OpenHands 把 Claude Code/Codex/Gemini CLI 当可互换后端)。
harness 层已经"有得选、可替换、能托管"——创新应落在四件套,而不是重写循环。
**选型决策树回答"自己写 vs 用框架";本页回答更前置的一问:直接把某个成熟 harness 拿来改,选哪个。
| 你的场景 | 优先考虑 | 理由 |
|---|---|---|
| 金融垂直 Agent 二次开发(本课推荐) | DeepSeek Harness(dsh) | 一切皆插件、配置即组合;有第三方源码解剖与预注册实测(dsh 专章:见「推荐落地底座」起各页) |
| 要最成熟的生态与扩展 | Claude Code | 延迟工具加载、prompt-cache 共享 fork |
| 要跨会话记忆 / 重工程 | Codex CLI | 自维护跨会话记忆;工具调用即代码 |
| 要云原生 + A2A 互通 | Gemini CLI | 语料中唯一 A2A 服务器 |
| 你的场景 | 优先考虑 | 理由 |
|---|---|---|
| 要最薄的研究基线 | Mini-SWE-Agent / Pi | 约 100 行七子系统/会话树版本控制 |
| 要多 harness 统一编排 | Omnigent(元 harness) | 多厂商收在一个 API 后,含 fail-closed 策略面 |
| 要可自托管开源底座 | OpenHands / OpenCode | 并行工具与资源锁定/客户端-服务器架构 |
三条使用纪律:
需求分析 → 数据生态 → 论文案例回访(运行时分层解剖)→ 主轴案例从 0 到 1 实现
(六步法:需求→架构→数据接口→知识库→工具库→Harness→Skills→测试评估与合规)
L06-Lab/用户故事:投研分析师每天要读 10+ 份财报 → 想要"输入代码+问题,输出结构化分析要点"。
任务树(逐步分解):
财报解读 Agent
├─ 抓取:财报三表 + 行情 + (可选)公告
├─ 解析:数字入结构化字段(知识库层)
├─ 指标:ROE/毛利率/流动性……(工具库纯函数)
├─ 问答:自然语言问财报(RAG 检索增强)
├─ 报告:研报要点生成(提示词+结构化输出)
└─ 合规:禁收益承诺/免责声明/人工确认
需求纪律:写清非目标(不提供买卖建议、不做盈利预测保证),边界即合规。
| 数据项 | 来源候选 | 格式 | 频率 | 许可/合规 |
|---|---|---|---|---|
| 财报三表 | AkShare / SEC EDGAR | 表格/文本 | 定期 | 公开数据,注明来源 |
| 行情 | AkShare / OpenBB | 时序 | 日/分钟 | 免费源限频 |
| 公告/新闻 | AkShare 公告接口/新闻源 | 文本 | 实时 | 版权注意转载边界 |
| 宏观 | FRED | 时序 | 日/月 | 免费 API key |
L06-Lab/homework/project_template/project_spec.md)| 约束 | 工程落点 |
|---|---|
| 防数据泄漏 | 测试期数据隔离、walk-forward(见「治理 1」) |
| 隐私 | 客户/内部数据不出域;本地部署选项(见「开源模型本地部署选项」) |
| 可解释性 | 每个数字带来源引用;指标口径可查 |
| 人在环 | 关键输出(研报/建议类)人工确认后才可发布 |
| 投资建议边界 | 规则层禁止收益承诺/确定性预测;强制免责声明 |
合规不是"装饰",它是需求的一部分——在需求文档阶段就写进验收标准。
| 数据源 | 覆盖 | 许可/门槛 | 合规要点 |
|---|---|---|---|
| AkShare | A 股/港股/宏观/公告,免费 | 公开数据聚合,限频 | 标注来源;尊重上游限流 |
| Tushare | A 股/基金/宏观 | 积分制(部分免费) | 遵守服务条款 |
| OpenBB | 多源聚合(美股等) | 开源 SDK+API key | 数据许可随上游 |
| FRED | 美国宏观 | 免费 API key | 注明 series id 可复现 |
| SEC EDGAR | 10-K/10-Q 全文 | 公开免费 | 版权归申报公司,可引用 |
各源接口与状态撰写当日复核;课堂代码默认 AkShare+离线缓存(断网可演示)。
来源:各官网(检索 2026-09-28)
| 环节 | 工具(Python) | 说明 |
|---|---|---|
| 数据处理 | pandas / numpy | 时序清洗、对齐 |
| 财务指标 | AkShare 内置 + 自写纯函数 | 口径自己定义(见「工具库层实现」) |
| 建模/回测 | scikit-learn;回测库撰写日核实 | 与 L04/L07 衔接 |
| 可视化 | matplotlib / plotly | 图表进报告 |
| 版本与依赖 | requirements.txt 锁定 | 可复现(见「部署与成本控制」) |
工具链原则:确定性计算全部交给纯函数——LLM 只做"理解与生成",不做算术。
| 任务 | 数据/工具 | 合规要点 |
|---|---|---|
| 财报抓取 | AkShare/EDGAR | 数据许可、时效标注 |
| 财报解析 | 知识库(分块+向量化) | 引用原文段落 |
| 指标计算 | 工具库纯函数 | 口径定义明确 |
| 财报问答 | RAG 检索 | 答案必须带引用 |
| 研报生成 | 提示词+结构化输出 | 禁收益承诺 |
| 合规检查 | 规则层+LLM 自检 | 免责声明强制 |
| 人工确认 | 人在环(interrupt) | 发布留痕 |
| 全程审计 | 追踪/日志 | 可回放 |
| 要素 | FinAgent 的对应 |
|---|---|
| 知识库 | 多样化记忆检索(长期记忆) |
| Harness | 双级反思循环(低层洞见→高层决策)+工具增强决策 |
| 工具库 | 技术指标计算、整合型交易策略/专家见解 |
| 数据接口 | 多模态行情、K 线、新闻 |
| Skills | 两级反思与策略技能(内化于模块设计) |
| 模型底座 | 多模态 LLM(论文为闭源商用模型时代设计) |
关键洞察:Agent 策略牺牲部分收益换取更严格风控(股票实验 EW 回报高于 agentic;BTC 窗口短)——三元权衡的实证样本。
注:论文摘要口径为"数据集构造整合 7 类金融数据",与正文符号表(6 类)的对照在撰写当日核对后再统一讲法(见交付说明【待核】项)。
| 评估维度 | 内容 |
|---|---|
| 11 指标评测体系 | 完成率/推荐准确率/BERTScore/ROUGE-L/数值引用率/LLM 六维质量分等 |
| Judge Agent | GPT-4o pairwise 对比+交换顺序消除位置偏差 → Adjusted Win Rate |
| 效率数字 | 全流程 3-4 分钟/报告;LLM 判断与人工多数一致率 90%(45/50) |
| 质量分 | 生成 4.1/5 vs 专家 4.3/5;Fleiss κ 0.67-0.82 |
| 项 | 内容 |
|---|---|
| 用户 | 投研分析师(学生扮演) |
| 输入 | --ticker 600519 + 自然语言问题(如"2025Q3 毛利率为何变化?") |
| 输出 | Markdown 分析报告(结论摘要/数据表/风险提示/免责声明/引用) |
| 非目标 | 不给买卖建议、不做收益预测、不生成虚构数字 |
| 成功标准 | 指标口径正确且有来源;引用可追溯;合规规则全部通过;人工确认留痕 |
| 验收指标 | 指标准确率≥阈值(测试集)、引用率、合规拦截率、延迟/成本上限 |
完整模板见
L06-Lab/homework/project_template/project_spec.md——小组项目第一步。
用户提问(ticker + 问题)
│
┌─────────────────▼──────────────────────────────┐
│ 数据接口层 AkShare 连接器 / EDGAR 连接器 / 缓存 │
└─────────────────┬──────────────────────────────┘
┌─────────────────▼──────────────────────────────┐
│ 知识库层 财报分块→向量库→检索(RAG) │
└─────────────────┬──────────────────────────────┘
┌─────────────────▼──────────────────────────────┐
│ 工具库层 指标纯函数 / 合规规则 / 格式化 │
└─────────────────┬──────────────────────────────┘
┌─────────────────▼──────────────────────────────┐
│ Agent 运行时·⑥编排子系统 LangGraph 八节点状态图 │
│ 抓取→解析→指标→问答→报告→合规→人在环→输出 │
│ + 检查点 + 熔断 + 每节点 trace │
└─────────────────┬──────────────────────────────┘
┌─────────────────▼──────────────────────────────┐
│Skills 层 "财报精读"/"研报要点"/"合规审查" 技能包│
└─────────────────┬──────────────────────────────┘
人工确认(interrupt)→ Markdown 报告 + 审计日志
与七子系统的对应关系:图中原称"Harness 层"的方框 = Agent 运行时,它覆盖 ⑥编排子系统+⑤安全权限+⑦扩展+横切会话基座;工具库 = 子系统 ③(Tools & actions);知识库/数据接口 = 子系统 ③ 的下游资源;模型底座 = 子系统 ②(LLM integration);子系统 ①(Agent loop)与 ④(Memory & context)在 LangGraph 内由状态图与检查点承担。
# L06-Lab/finrpt_agent/layers/data/akshare_connector.py
import akshare as ak
def fetch_balance_sheet(symbol: str) -> "pd.DataFrame":
"""获取资产负债表(新浪口径);失败时抛带上下文的异常"""
df = ak.stock_financial_report_sina(
stock=f"sh{symbol}", symbol="资产负债表") # 接口名以 AkShare 文档为准
return df
def fetch_daily_price(symbol: str, start: str, end: str) -> "pd.DataFrame":
return ak.stock_zh_a_hist(symbol=symbol, period="daily",
start_date=start, end_date=end, adjust="qfq")
L06-Lab/finrpt_agent/layers/data/(含 EDGAR 备用连接器与缓存)| 件 | 本案例的具体内容 | 代码位置(L06-Lab/) |
|---|---|---|
| 本地知识库 | 财报正文+附注+模板库;每块带来源句柄 | layers/kb/ |
| 数据接口 | AkShare 三表+行情;EDGAR 备用;离线缓存 parquet | layers/data/ |
| skill 库 | income_reader/report_writer/compliance_review |
layers/skills/ |
| 脚本库 | ROE/毛利率/净利率等纯函数+单测 | layers/tools/ |
验收口径:答案必带引用|断网可演示|技能有 schema 与自检|数字出自脚本。
两套语言对照:
| 运行时分层 | 四件套(本页观点) |
|---|---|
| 数据接口层 / 知识库层 / 工具库层 / Skills 层 | → 数据接口 / 本地知识库 / 脚本库 / skill 库 |
| 编排子系统+安全+扩展+会话基座 | → 通用 harness(不自研) |
一句话记忆:"通用层买现成的,领域层自己攒四件套"——小组项目评分按四件套逐项自检。
# 简化示意;完整实现见 L06-Lab/finrpt_agent/layers/kb/
chunks = chunk_text(financial_report_text) # 按章节/段落分块(含来源句柄)
store.add(chunks) # 向量化入库
hits = store.search(question, top_k=5) # 检索
answer = llm(f"根据以下财报片段回答问题,并标注引用:[{hits}] {question}")
def roe(net_profit: float, avg_equity: float) -> float:
"""ROE = 归母净利润 / 平均净资产(口径可配:期初/平均)"""
if avg_equity == 0: raise ValueError("avg_equity 不能为 0")
return net_profit / avg_equity
def gross_margin(revenue: float, cogs: float) -> float:
if revenue == 0: raise ValueError("revenue 不能为 0")
return (revenue - cogs) / revenue
from langgraph.graph import StateGraph, END
from typing import TypedDict
class AgentState(TypedDict):
ticker: str; question: str
statements: dict; metrics: dict; report: str; logs: list
g = StateGraph(AgentState)
g.add_node("fetch", fetch_node) # 数据接口层
g.add_node("parse", parse_node) # 知识库层
g.add_node("metrics", metrics_node) # 工具库层
g.add_node("qa", qa_node) # 知识库+工具
g.add_node("report", report_node) # Skills: 研报要点
g.add_node("compliance", compliance_node) # 规则+LLM自检
g.add_edge("fetch", "parse"); g.add_edge("parse", "metrics")
g.add_edge("metrics", "qa"); g.add_edge("qa", "report")
g.add_edge("report", "compliance")
g.add_conditional_edges("compliance", route_after_compliance, # 合规不通过→report 重写
{"rewrite": "report", "pass": "human_confirm"})
g.add_node("human_confirm", human_node) # interrupt 人在环
g.add_edge("human_confirm", END)
L06-Lab/finrpt_agent/layers/harness/graph.py(依赖 langgraph>=1.2)L06-Lab/finrpt_agent/layers/skills/
├── income_reader/ # 技能:财报精读
│ ├── prompt.md # 角色/步骤/输出 schema(差/好对照见「提示词工程」)
│ ├── script.py # 配套确定性代码(分块、抽取)
│ └── checker.py # 自检:数字有来源?口径标注?
├── report_writer/ # 技能:研报要点(模板库)
└── compliance_review/ # 技能:合规审查(规则+LLM 双检)
.agents/skills/ 跨厂商趋同,并出现注册表与信任分级;延迟加载(deferred loading)是主导模式(按需披露,省上下文成本,接「效率:按「成功任务成本」计价」)FORBIDDEN = ["建议买入", "目标价", "保证收益", "必涨"] # 规则层一票否决
DISCLAIMER = "本报告由 AI 辅助生成,仅供学习研究,不构成投资建议。"
def compliance_check(report: str) -> tuple[bool, list[str]]:
hits = [w for w in FORBIDDEN if w in report]
return (len(hits) == 0, hits)
ctx.tools.restrict() 在其官方文档中被明确描述为"一种可见性组合,不是权限边界"。把工具从模型视野里藏起来,不等于禁止它被调用——金融场景必须另设真实的权限边界(进程/文件/网络级),不能只靠提示词与可见性本课建议学生基于 dsh 二次开发,实现自己的垂直领域智能体。
| 维度 | 事实 |
|---|---|
| 出身 | DeepSeek 官方 harness;2026-08-13 开源,MIT、TypeScript、developer preview |
| 定位 | service-locator 运行时——"连 agent loop 都是一行可替换的配置";哲学 everything is a plugin(约 230 个插件) |
| 规模 | loop driver 515 行(pi 796 行、deepagents 不自建)——循环不竞争,竞争力在插件面 |
| 本机可用 | 已装 @deepseek-ai/dsh@0.2.0-rc.2(2026-10-06)——现在就能跑 |
与课程目标的关系:dsh 提供可审计的底座,把学生精力释放到领域四件套上——「四件套」主张的落地方式。
来源:arXiv:2608.23953(Dai Jiahong),三个哲学对立的 harness 源码级对照。
dsh-v0.1.1-rc.2,commit b150a551b,逐子系统对照并读 commit 历史llm-pi-ai 依赖 pi 发布的 @earendil-works/pi-ai),源码内自述为 "design-verification twin"——作者据此不宣称三者独立发明来源:arXiv:2608.01347 附录 O。
| 项 | 内容 |
|---|---|
| 冻结 | 2026-08-19(baseline 激活门后、任何对照臂前);任务/提示/夹具/评测器/指标全不变——"The variable is the agent harness." |
| 配置 | dsh 0.1.0rc7;无人值守组合 dsh-jsonrpc-agent;模型固定 Claude Sonnet 5 |
| 规模 | 5 任务×5 臂×3 重复 = 75 次有效运行;15 个单元全部解出 |
| 结果 | baseline $0.2753 → full $0.0490(−82.2%);effort 单臂 −74.7%(详见「效率:按「成功任务成本」计价」) |
用七个规范子系统解剖 dsh。看点:五个已收敛的要素它都做到强形态。
| 子系统 | dsh 的实现(论文口径) |
|---|---|
| ① 循环 | 515 行 driver,本身是一行可替换的配置(ctx.agentLoop) |
| ② LLM 集成 | adapter 配置+运行时能力解析;模型怪癖外置为数据 |
| ③ 工具 | 本地 bash+文件工具;注册表可暴露原生函数调用或 Code Mode |
| ④ 记忆与上下文 | 事件溯源会话+"可见 ⇒ 已记录"断言+replace 操作;上下文自动压缩 |
| 子系统 | dsh 的实现(论文口径) |
|---|---|
| ⑤ 安全与权限 | bwrap / Landlock OS 级沙箱;失败抛错(SANDBOX_UNAVAILABLE)而不降级无沙箱;策略按调用而非按供应商 |
| ⑥ 编排 | subagent 委派+workflow orchestration(可选) |
| ⑦ 扩展 | 一切皆插件:配置行、钩子、Skills、MCP、插件市场 |
两条金融关键设计:① "可见 ⇒ 已记录"——模型看到过的一切必须能从日志重建,是运行时断言(审计地基);② 沙箱失败即抛错——宁可拒绝执行。
边界:只到运维可重建,未达第三方可校验;其文档坦白
ctx.tools.restrict()是"可见性组合,不是权限边界"——少看见 ≠ 不能做。
插件机制四条规则(论文口径):
| 规则 | 含义 |
|---|---|
| 插件=实现某服务的对象 | 没有专用基类、没有注册表清单 |
| 按稳定 context key 解析 | 消费方从不 import 实现 → 可整片替换能力世界 |
加载顺序用 inject 声明 |
依赖声明式,不靠 import 顺序 |
| 注册是可逆副作用 | reload 时自动 unwind → 可热重载、可回退 |
配置=分层 patch:
空根 → bundle 层(dsh-base / dsh-sdk-minimal / dsh-web-app / …)
→ profile 自己的 cordis.patch.yml
→ home 级 $DSH_HOME/cordis.patch.yml
→ --patch 覆盖层 每条都是一层 patch,按序叠加成最终配置树
约 230 个插件可归成五类——正好对应四件套与护栏:
| 类别 | 代表插件 | 对应 |
|---|---|---|
| 工具 | dsh-tool-bash/-fs/-web/-todo/-subagent |
数据接口 |
| 技能 | dsh-skill/-filesystem/-office |
skill 库 |
| 会话 | dsh-session-persistence-jsonl/-projection/dsh-compaction-* |
本地知识库+审计取数 |
| 安全 | dsh-sandbox-policy/dsh-user-approval/-permission-presets | 合规护栏、人在环 |
| 模型/工作流 | dsh-llm-deepseek/dsh-llm-pi-ai/dsh-workflow/dsh-goal | 换底座、多步流水线 |
入口:dsh --profile sdk-minimal|dsh --profile headless "任务"|dsh plugin --profile <name> <pnpm args>
| 步 | 做什么 | 落在 dsh 的哪个面 | 交付物 |
|---|---|---|---|
| 1 起底座 | dsh --profile sdk-minimal,跑通一个内置任务 |
profile 布局 | 基线+一份 session JSONL |
| 2 接数据接口 | 写"取数工具插件"(行情/财报/宏观) | 工具类插件 | 代码+单测+缓存策略 |
| 3 建本地知识库 | 语料入库,经 MCP/会话投影进上下文 | dsh-mcp-*/-session-projection |
语料清单+版本+引用可追溯 |
| 4 写脚本库 | 指标纯函数、口径校验、对账断言 | 工具/脚本面 | 纯函数+doctest |
| 5 编 skill 库 | 领域流程写成 SKILL.md(角色/步骤/schema/自检) | Skills 面 | 可复用技能包 |
| 6 上护栏与审计 | 权限预设、人在环、用 session JSONL 做成本复盘 | dsh-user-approval/-session-* | 合规自查表+成本报告 |
ctx.agentLoop);改循环会让你失去官方升级能力为什么强调:前两条保护升级能力,后两条回应金融的审计与成本要求——对应评分表"合规与可观测"那 15 分。
# 一个"取数工具"插件的形状(概念示意,非 dsh 官方 API)
@tool("get_financials") # 工具名 → 模型可见
def get_financials(symbol: str, period: str) -> dict:
"""取指定标的、指定期间的财报三表(口径见 docs/口径.md)"""
df = cache_or_fetch(symbol, period) # 数据接口:缓存 + 降级
return {"rows": df.to_dicts(), "source": "akshare", "as_of": today()}
skills/financial_reading/
├── SKILL.md 角色 / 步骤 / 输出 schema / 自检清单
├── script.py 配套确定性代码(分块、抽取)
└── checker.py 自检:数字有来源?口径标注?
这套骨架已构成一个最小垂直智能体:工具=数据接口、SKILL.md=skill 库、script/checker=脚本库、语料=本地知识库(四件套齐)。
与小组项目的关系:小组项目的选题 E(可外部校验的审计记录)与本题最契合——在 dsh 上补齐第 4 条纪律,就是本课最高阶的交付。
| 维度 | ① 自研循环 | ② 框架(本课主轴代码) | ③ dsh 二次开发(推荐进阶) |
|---|---|---|---|
| 起点成本 | 最高(全部自己写) | 中(框架给状态图与检查点) | 最低(起一个 profile 即可跑) |
| 生产实践证据 | 11 个生产 harness 全部手写循环、无一处 import 通用框架 | 无生产 harness 采用 | 被 2608.23953 选为三案例之一;被 2608.01347 选作实验底座 |
| 可验证性 | 自己造 | 自己造 | 到"运维可重建"为止,外部可校验仍需自建 |
本课立场: ① 教学用 ②——显式状态图最适合讲清"可控性落在哪里";② 工程推荐 ③——通用层交给成熟 harness,预算投四件套;③ ①留着当参照——知道生产 harness 都是手写循环,就不会把"用框架"误当成"工程成熟"。
三者不冲突:②与③实现的是同一个四件套,换的只是通用层——验证「四件套」的核心观点。
cd L06-Lab && python -m finrpt_agent.demo --ticker 600519 --question "2025Q3 毛利率为何变化?"
预期输出(八节点逐步打印):
技术保障:
prepare_demo_data.py预取缓存;单步超时;固定随机种子——课堂不翻车。
| 注入故障 | 系统行为 | 教学点 |
|---|---|---|
| 行情接口超时 | 熔断→读缓存降级 | 防护 1(熔断)真实生效 |
| 财报缺某期 | 显式报错+提示 | 不编数、不猜数 |
| 模型输出"建议买入" | 合规节点拦截→重写→仍需人审 | 护栏三层 |
| 连续失败 | 预算/轮次上限触发 | 成本控制 |
演示脚本:
L06-Lab/finrpt_agent/fault_demo.py(故障可离线注入,不依赖外网)。
| 层 | 内容 |
|---|---|
| 单元测试 | 指标函数(除零/缺失边界)、合规规则 |
| 回放测试 | demo 会话记录→回归(输出变化即告警) |
| 评估集 | ≥20 条财报问答(含标准答案与引用检查点) |
| 双评估 | LLM-as-Judge(注明顺序/自利偏差)+人工抽样复核 |
| 指标 | 指标准确率/引用率/合规拦截率/延迟/成本 |
评估集模板与评分细则:
L06-Lab/homework/project_template/evaluation_plan.md。
| 底座方案 | 模型示例 | 资源需求(约) | 适用 |
|---|---|---|---|
| Ollama(一键) | Qwen3 量化档 / DeepSeek 量化档 | 8–24GB 显存(取决于量化) | 课程项目、个人实验 |
| vLLM(高吞吐) | Qwen 全精度档 | 多卡/大显存(撰写日复核具体档位) | 批处理、小组服务 |
base_url 即可,Harness 代码零改动| 项 | 做法 |
|---|---|
| 成本上限 | Token 预算/轮次上限(见「选型决策树」);月度限额熔断 |
| 缓存 | 数据与中间结果缓存(fetch/embeddings) |
| 日志与回滚 | 版本化输出+检查点回滚(见「工程防护 2」) |
| 灰度 | 先内部用户,再逐步放开;人审比例逐步下调但要留底 |
| 费用量级 | API 按 token 计费、本地按硬件折旧——以写稿当日厂商价目为准,课件只讲量级与方法 |
python -c "
import akshare as ak
df = ak.stock_financial_report_sina(stock='sh600519', symbol='资产负债表')
print(df.head(3))
"
roe(net_profit, avg_equity) 并算出一期 ROE;③ 指出一个合规要点L06-Lab/examples/ex1_function_calling.py 的离线模式(先 prepare_demo_data.py)六步:需求 → 架构
→ 数据接口
→ 知识库/工具库
→ Agent 运行时(编排子系统)
→ 测试/合规部署
十一个常见坑(课堂也会碰到的):
输入缺陷前置检查:开工前先澄清范围(scope)与假设——误导性架构提示会让推理成本 2.61×,范围模糊会让成功率掉到 83%(见「常见失败模式」)。
| 场景 | 数据接口 | 知识库 | 工具库 | 编排子系统差异点 |
|---|---|---|---|---|
| B 舆情监控 | 新闻源 | 事件/主体知识 | 情感分类、异动规则 | 定时触发+预警路由 |
| C 合规客服 | 政策/法规库 | 法规 RAG | 话术校验 | 严格护栏+强制人审 |
| D 量化信号 | 行情/因子数据 | 因子说明文档 | 因子计算、回测 | 与 L04/L07 衔接;隔离测试期 |
Agent 评测基准(通用→金融) → 评测方法学 → 金融风控与合规治理
→ 学术研究场景与方法论 → 顶刊文献 → 展望
| 基准 | 出处 | 关键数字 |
|---|---|---|
| GAIA | HFAI+Meta FAIR;ICLR 2024(官方 proceedings 页);arXiv:2311.12983 | 466 题;人类 92% vs GPT-4+插件 15%——"对人类简单、对 AI 难" |
| AgentBench | 清华 THUDM 等;ICLR 2024;arXiv:2308.03688 | 8 个交互环境(操作系统/数据库/游戏……) |
| 基准 | 出处 | 规模 |
|---|---|---|
| FinBen | AI4Finance/The-FinAI;NeurIPS 2024 Datasets & Benchmarks(papers.nips.cc 确认);arXiv:2402.12659 | 36 数据集/24 任务/7 方面(含交易、Agent/RAG 评测;具体任务口径撰写日核对) |
| FinEval | 复旦大学;NAACL 2025 Long(aclanthology 确认);arXiv:2308.09975 | 8,351 题:学术 4,661/行业 1,434/安全 1,640/金融 Agent 616 |
金融 Agent 的"事故复盘"三问:数据泄漏了吗?决策有痕吗?当时人在吗?
补充三问(领域溯源):这份数据截止到何时(as-of)?这个结果能否出域?成本上限是否守住了(可否被证明)?
LLM 在金融研究中的三角色:
研究最佳实践(学术规范):
回顾:① 评测=通用基准(GAIA/AgentBench/τ-*)+金融基准(FinBen/FinEval)+方法学三件套;② 治理=防泄漏+审计回放+熔断+可观测+人在环;③ 学术=三角色+可复现规范;④ 8 篇顶刊文献全部经 Crossref 卷期/DOI 复验
前沿展望(2026):
作业 1 · 提示词工程改写
作业 2 · 组件级工具函数(1 个函数 + 运行截图)
fetch_balance_sheet(symbol)+roe(net_profit, avg_equity);类型标注+docstring+doctestL06-Lab/homework/hw2_data_tool.py文献阅读作业(4 组精读,八篇分配):每组 2 篇,回答"用了什么 LLM 方法/识别出什么机制/对你项目的启示"。
<font size=5>
</font>
<font size=5>
</font>
> 勘误:v2026 将"Coordinator+学科 Worker"架构归为 SciAgent——该内容实为已撤稿的 OpenDCAI/SciAgent(arXiv:2511.08151,2025-11-17 作者主动撤稿,见 arXiv 撤稿页),本版已剔除;SciAgent(2409.05556)正确内容见「案例回访 5」。
引用:框架能力以各官方文档为准;实证见 arXiv:2609.00006 §13.2(检索 2026-09-29)
- **虚构内容已全部删除**:MCP 控制消息、UUID=SHA256、心跳监控等在论文中不存在(全文检索 0 命中)
- 教学价值:**leakage-safe 设计**是金融时序 Agent 的必考题(见「治理 1」呼应)
- 教学价值:辩论式协作(多视角对抗)与层级式协作(分工管控)代表了两种多 Agent 组织哲学
> 【新图】正式版由授课者美化;结构即 `L06-Lab/finrpt_agent/layers/` 目录。
- 教学价值:技能包=可复用知识资产,小组项目之间可交换验证
- **状态说明**:两者截至检索日(2026-09-28)为 arXiv 预印本+Sierra 官方记录,**不冒充顶会发表**
- 教学价值:金融客服/投顾对话类 Agent 可直接套用其任务模板做评估
- 教学设计:小组项目的评估集可采样自 FinEval 风格题目+自建财报问答集(见「测试与评估」)
- 教学落点:Part 3 财报解读 Agent 的"分析报告→信号"延伸即此类研究问题
**用 arXiv:2605.18747 的六条开放挑战收尾**(每一条都对应本讲一个落点): ① 超越最终任务成功率的评测② 不完整反馈下的验证(见「合规检查与人在环」)③ **无回归的 harness 改进**(见「效率:按「成功任务成本」计价」与「工程防护」两节)④ 多 Agent 间一致共享状态(见「并行集成」与「验证样本的两个用途」)⑤ **安全关键动作的人类监督**(见「合规检查与人在环」与「工程防护 1」)⑥ 多模态环境扩展(见「上下文与多模态」)
### 小组项目:用开源工具实现一个金融垂直领域 AI Agent(讨论) <font size=5> **题目菜单(5 选 1)**:A 财报解读与 RAG 问答 Agent(默认,扩展多公司/多期对比)|B 舆情监控 Agent|C 合规客服/政策问答 Agent|D 量化信号 Agent|**E 可外部校验的金融 Agent 审计记录(高阶选题)** > **选题 E 说明**:来自「可验证性缺口」的**前沿缺口**——生产级 harness 全部缺少"外部方无需信任运行时即可校验、防篡改"的记录。E 题要求为主轴案例补上:**只追加的会话记录+哈希链+可信时间戳+as-of 数据溯源+成本上限的可证明性**。这不是课程练习,而是**真实的研究缺口**(2608.23953 明确把"领域溯源"列为下一竞争轴)。 **验收标准**:需求文档(≤1 页)+**Agent 运行时分层架构图(并标注对应七个规范子系统中的哪几项)**+可运行代码(基于 project_template)+≥10 条评估用例+合规自查清单+现场演示 **加分观测点(不改变总分)**:① 成本报告是否用"**成功任务成本**"口径;② 是否说明**为什么用/不用框架**(选型决策树判据);③ 审计记录是否**可被外部方校验**(选题 E 则为核心要求) **评分量表(100 分)**: <div style="display:flex;justify-content:center"> | 项 | 分值 | 要点 | |---|---|---| | 需求与设计 | 20 | 用户故事/非目标/运行时分层架构(+七子系统标注) | | 实现正确性与可运行性 | 35 | 运行时分层齐全+2;**编排子系统含护栏与追踪+3** | | 评估与测试 | 20 | 用例质量、双评估 | | 合规与可观测 | 15 | 防泄漏/免责/日志回放;**可被外部校验的记录**(见可验证性缺口) | | 演示与文档 | 10 | 现场演示 + README | </div> **运行环境**:Python 3.10+、`requirements.txt` 版本锁定、默认 Ollama 本地模型(零成本)或自备 key;`L06-Lab/homework/project_template/` 提供骨架。 </font> ---
--- ### 附录 A:术语表(更新)与讲义精华归档 <font size=3> <div style="display:flex;justify-content:center"> | 术语 | 定义 | |---|---| | Agent | LLM 驱动的感知-规划-行动-反思自主系统(本课教学定义) | | **Harness** | **模型之外的整个运行时**(=七个规范子系统);τ-bench 首创"agent harness"用法,harness engineering 于 2026 年初成为学科(arXiv:2609.00006 §2.1) | | **Agent 运行时** | 本课对"模型+Harness+知识库+工具库+数据接口+Skills"整体的称呼(教学框架) | | **编排子系统** | 七个规范子系统之 ⑥(原 v2027 误称"Harness 层");本课 LangGraph 实现即此层 | | **七子系统** | Agent loop/LLM integration/Tools & actions/Memory & context/Safety & permissions/Orchestration/Extensibility+两横切面(界面层、会话基座) | | **成功任务成本** | cost per successful task——由 Agent 轨迹诱发的端到端成本,效率的终端指标(arXiv:2608.01347) | | **外部可验证性** | 外部方**无需信任运行时**即可校验的防篡改记录——三个生产 harness 全部为零(arXiv:2608.23953 §7) | | Skills | 可复用技能包=提示词+脚本+校验(Anthropic/CrewAI 概念) | | Workflow | 确定性管道(DAG),决策在编译期 | | ReAct / RAG / Function Calling | 推理-行动循环/检索增强生成/函数调用 | | MCP / A2A | Agent↔工具 / Agent↔Agent 的标准协议 | | 记忆 / Guardrails / OODA | 状态与知识/行为护栏/教学类比框架 | | Walk-forward | 严格时序隔离的滚动验证 | </div> **原讲义长文精华归档(6 条)**:场景详析四类、局限应对四法、大学生/专业人士/学术三类最佳实践、AI 伦理四则、未来展望与风险、监管适应——详见交付说明附录归档(不进正片)。 </font> --- ### 附录 B:框架对照表、推荐资源与致谢 <font size=5> <div style="display:flex;justify-content:center"> | 框架 | 流派 | 优势 | 不足 | 版本/检索日 | |---|---|---|---|---| | LangGraph | 严谨编排 | 显式可控、检查点 | 学习曲线 | 1.2.12(2026-09-28) | | AG2 | 角色流水线 | 对话式多体 | 状态流不如图式 | 1.1.0 | | CrewAI | 角色流水线 | 角色化快 | 复杂状态弱 | 1.15.22 | | LlamaIndex | 数据/RAG | 检索原生 | Agent 较薄 | 0.14.25 | | OpenAI Agents SDK | 轻量 | 上手快 | 生态绑定 | 0.22.x | | PydanticAI | 轻量/类型 | 结构化输出强 | 生态新 | 2.51.0 | | smolagents | 轻量/代码 | 极简 | 可控性弱 | 1.26.0 | | Agno | 轻量 | 维护接续 | 迁移波动 | 3.0.11 | | Dify / n8n | 平台 | 可视化 | 定制受限 | 1.17.x / 2.40.x | | DeepSeek Harness | 新丁 | 官方、插件化 | preview/TS | 2026-08 起(preview) | | Pi/pi-agents | 新丁 | 预算护栏好 | 生态早期 | 0.21.0 | </div> **推荐资源(全部附 URL 与检索日期 2026-09-28)**:OpenAI/Anthropic/Google 官方 Agent 指南(openai.com/agents 等撰写日复核);arXiv 论文清单(本讲引用的 arXiv 号与 DOI);数据源官网(akshare.akfamily.xyz、tushare.pro、openbb.co、fred.stlouisfed.org、sec.gov/edgar);基准主页(huggingface.co/gaia-benchmark、sierra.ai、FinBen 官方仓库)。 > 感谢你的学习与时间——**现在,去实现你自己的金融 Agent 吧。**(Questions welcome) </font>