
2026年AI Agent 的开发讨论重心明显变了大家不再只关心“模型能不能回答问题”而是更关心“Agent 能不能稳定地完成多步任务、用对工具、记住上下文、并且在下一次做得更好”。这个背景下Harness 成了一个高频词。最近的社区检索里deepseek harness、codex harness、agent框架、harness工程这些关键词都在快速上升。很多人把它理解成某种软件包其实更准确的说法是Harness 是一种工程方法论是一套套在模型外面的“驾驭框架”。这篇文章就以“学习助手”为开发案例从项目分析到原理分析走一遍完整的 Harness 落地过程。我们会先搞清楚 Harness 和 Agent 的区别再看上下文工程和自进化机制怎么落地最后给出可直接参考的代码结构、测试方案和批量任务设计。如果你正在做 Agent 开发、学习助手、知识问答类工具或者想搞懂 Harness 到底是什么这篇文章可以直接收藏。先给结论Harness 不是替代 Agent 的新模型而是让 Agent 变得可控制、可观察、可进化的“外骨骼”。下面逐步展开。1. 核心能力速览能力项说明项目类型Harness 工程实践 自进化 Agent 上下文工程落地案例主要功能学习助手知识问答、习题生成、错题分析、批量教学任务核心思路用 Harness 管理 Agent 的上下文、工具、反馈与经验回放开发语言Python 3.10运行方式本地 Python 服务 OpenAI 兼容格式的大模型 API硬件要求不需要本地 GPU需要能访问大模型 API 的网络环境是否支持 API支持使用 FastAPI 暴露接口是否支持批量任务支持提供批量任务调度与失败重试示例是否支持自进化支持通过经验回放和反思机制迭代优化适合人群Agent 开发者、AI 应用工程师、学习类产品设计者学习成本需要掌握基础 Python、HTTP 调用、JSON 数据处理2. Harness 与 Agent 到底有什么区别先说结论Agent 是“大脑 手脚”Harness 是承载大脑和手脚的“副驾系统”。社区里经常有人把harness和agent当成同一个东西其实两者解决的问题不同。Agent 强调的是“自主决策”模型理解任务、拆解步骤、选择工具、生成回复。它的核心是推理能力。举例说你给 Agent 一个任务“帮我整理这章知识点的五道练习题”Agent 会自己设计出题思路、调用题库、生成题目。Harness 强调的是“控制与稳定”它不负责具体推理而是负责规定 Agent 怎么思考、怎么用工具、怎么保留关键信息、怎么从失败中学习。一个标准的 Harness 通常包含几个部分上下文管理器维护对话窗口、压缩历史、注入检索结果。工具注册表约束 Agent 可以调用哪些函数以及调用参数格式。执行循环控制 Agent 的“思考-行动-观察-再思考”节奏。反馈记录器收集任务结果、评分、失败原因。经验回放器把成功的决策路径沉淀为 few-shot 示例下一次直接复用。和 Harness 紧密相关的是“上下文工程”。热词里也有大量上下文工程相关检索。上下文工程要解决的是模型的上下文窗口是有限的怎么在有限的窗口里塞进去“对当前任务最有用”的信息。这包括系统提示词设计、历史消息摘要、关键片段抽取、向量检索结果注入、工具返回结果裁剪。三者关系可以这样理解概念解决的问题类比Agent自主完成任务的智能体驾驶员Harness约束和控制 Agent 执行过程仪表盘与操作框架上下文工程决定模型每一轮看到什么信息仪表盘上的信息布局3. 学习助手案例的适用场景与使用边界3.1 这个案例适合谁学习助手是一个非常典型的 Harness 应用场景原因在于它要求多种能力的组合基础问答、题目生成、错题讲解、知识扩展。每一步都需要模型调用不同工具、读取不同资料、保持对学习进度的一致性理解。如果你正在做以下方向这个案例的可参考性很强教育类 Agent在线答疑、智能题库、错题本。企业内部培训工具知识库问答、考试模拟。Agent 框架研究想把自进化机制落到自己的项目里。Agent 架构设计想理解上下文管理、工具调度、反馈回路怎么设计。3.2 能解决的问题学习助手最值得做的三个能力是不懂的知识解释到懂、会诊断学习者的薄弱点、能按薄弱点批量生成训练题。这三个能力不是靠一次大模型调用就能稳定完成的必须靠 Harness 把任务拆成“检索知识 - 生成讲解 - 生成题目 - 校验结果”的流程并保证每一阶段的信息不丢失。3.3 不适合什么场景Harness 不是银弹。如果你的学习助手只需要简单的单轮问答直接调用大模型 API 就够了不需要引入 Harness否则会明显增加延迟和 Token 消耗。另外如果你的业务对回答实时性要求极高、对成本又极其敏感那么 Harness 的多步规划机制可能会让你觉得“太重”。Harness 的收益在复杂任务和长周期一致性上简单任务不要硬套。3.4 使用边界与合规提醒学习助手会涉及用户输入的学习记录、错题数据、个人知识水平这些都是敏感信息。开发时要注意用户数据不要明文写入日志。不要把学生个人信息拼进提示词后发送给第三方 API除非你已确认隐私协议合规。涉及题库、教材内容时确认你是不是有合法的使用授权。“自进化”必须有边界不是让 Agent 无限制改写系统提示词和工具逻辑而是在预设范围内优化 few-shot 示例和检索策略。4. 环境准备与前置条件4.1 基础环境这个案例不需要本地 GPU核心依赖是 Python 环境和模型 API。建议使用如下环境组合Python 3.10 / 3.11 操作系统Windows / macOS / Linux 均可 网络可正常访问大模型 API 服务4.2 Python 依赖需要安装的 Python 包如下pip install openai fastapi uvicorn pydantic其中openai用于调用 OpenAI 兼容格式的大模型接口fastapi和uvicorn用于暴露本地 APIpydantic用来做请求参数校验。4.3 模型 API代码中使用的是 OpenAI 兼容接口所以理论上支持大多数兼容该格式的模型服务比如 DeepSeek、OpenAI 官方接口或者本地部署的兼容服务。实际使用时需要两个信息API_KEYsk-你的密钥 API_BASE_URLhttps://api.your-llm-provider.com/v1 MODEL_NAME你的模型名不同的模型供应商地址和模型名不一样这里不能直接写死请按你的实际服务商配置。4.4 项目目录建议建议按下面的目录组织代码避免后面批量任务和日志追踪时一团乱study-harness/ ├── app.py # FastAPI 服务入口 ├── harness/ │ ├── __init__.py │ ├── context.py # 上下文管理器 │ ├── tools.py # 工具注册与调用 │ ├── agent.py # Agent 执行循环 │ └── evolution.py # 自进化与经验回放 ├── datasets/ │ └── questions.jsonl # 历史题目数据 ├── outputs/ │ └── quiz_results.jsonl # 批量生成结果 └── config.py # 配置项5. 学习助手项目需求拆解写代码之前先做需求拆解。这是文章标题里“从项目分析到原理分析”的关键一步。学习助手的功能需求可以拆成三层第一层是基础问答层。用户提出学习问题助手给出解释。这个能力最基础关键在于“解释要贴合用户当前知识水平”所以需要记录用户画像比如学习阶段、薄弱点。第二层是内容生成层。根据某个知识点生成题目、生成讲解材料、生成对比表格。这里需要工具能力比如调用题库函数、检索知识库。第三层是学习闭环层。根据用户的错题记录诊断薄弱点生成针对性的训练计划。这里需要 Harness 的长期记忆和经验回放能力让系统“越用越懂这个用户”。从 Harness 的角度看这三层对应三个核心机制上下文管理用户画像、历史对话摘要、知识库检索结果。工具调度题目生成、知识检索、难度评估。自我进化每次完成任务后记录“哪种提示词策略对这个用户更有效”更新少量示例库。6. 原理分析Harness 如何驱动自我进化的 Agent6.1 Harness 的三层执行结构一个实用的 Harness 执行循环可以抽象为三层Plan 层接收用户请求拆解为子任务。比如“生成五道题并讲解”会被拆成“生成题目 - 逐题生成讲解 - 校验答案 - 汇总输出”。Act 层按子任务执行工具调用。每调用一个工具结果会以“观察”的形式写回上下文。Reflect 层在任务结束后记录决策路径、工具执行结果、最终评分。如果评分不达标反思失败原因更新策略。这个循环和传统 Agent 的最大区别是它不追求一次完成所有决策而是把决策过程显式地写进上下文让每一步都可回看、可修改、可复用。6.2 上下文工程的具体做法上下文工程不是“提示词写得好”这么简单。它要处理的是动态信息。以学习助手为例上下文窗口里可能要放固定部分系统提示词、工具说明、输出格式要求。动态部分用户当前问题、知识库检索结果、历史对话摘要、用户画像。动态部分的问题在于长度不可控。所以 Harness 里常见的处理方式是分级压缩关键信息原样保留次要信息做摘要冗余信息直接丢弃。比如历史对话超过十轮后把前九轮压缩成一段 200 字的学习进度摘要。代码层面上下文管理器可以这样实现from typing import Dict, List class HarnessContext: 管理 Agent 的上下文负责注入和压缩。 def __init__(self, max_dialog_turns: int 10): self.max_dialog_turns max_dialog_turns self.dialog_turns: List[Dict[str, str]] [] self.user_profile: Dict[str, str] {} self.knowledge_docs: List[str] [] def add_turn(self, role: str, content: str) - None: self.dialog_turns.append({role: role, content: content}) if len(self.dialog_turns) self.max_dialog_turns: self.compress_dialog() def inject_knowledge(self, docs: List[str]) - None: self.knowledge_docs docs def compress_dialog(self) - None: 把最早的部分对话压缩为摘要这里简化处理。 old_turns self.dialog_turns[:-4] self.dialog_turns self.dialog_turns[-4:] def build_messages(self, system_prompt: str) - List[Dict[str, str]]: messages [{role: system, content: system_prompt}] for d in self.knowledge_docs: messages.append({role: system, content: f[知识参考] {d}}) for turn in self.dialog_turns: messages.append(turn) return messages注意compress_dialog目前只是简单地丢弃旧消息真正的项目里应该调用模型生成摘要再替换掉旧部分。这里保留最简单结构方便理解。6.3 自我进化机制的落地思路“自我进化的 Agent”听起来玄学实际上在 Harness 里就是一个经验回放系统。核心思路是每一次任务结束后把这段任务的输入、输出、工具调用记录、评分保存下来。定期对失败样本做反思提取改进后的 few-shot 示例。学习助手的进化目标是提高“回答相关性”和“出题格式稳定性”。实现方式可以设计为import json from datetime import datetime class ExperienceReplay: 记录任务经验并基于失败样本更新 few-shot 示例库。 def __init__(self, storage_path: str ./outputs/experience.jsonl): self.storage_path storage_path self.few_shot_examples [] def record(self, task_id: str, prompt: str, output: str, score: float) - None: record { task_id: task_id, prompt: prompt, output: output, score: score, timestamp: datetime.utcnow().isoformat(), } with open(self.storage_path, a, encodingutf-8) as f: f.write(json.dumps(record, ensure_asciiFalse) \n) if score 0.8: self.few_shot_examples.append( {task_id: task_id, prompt: prompt, output: output} ) def evolve_system_prompt(self, base_prompt: str) - str: if not self.few_shot_examples: return base_prompt example_text \n.join( [f示例{e[prompt]} - {e[output]} for e in self.few_shot_examples[-5:]] ) return f{base_prompt}\n\n参考高质量回答示例\n{example_text}这里可以理解为Harness 每次成功完成一个高质量回答就把这个回答保存成后续模型的参考示例。下次同类任务系统提示词里自动加上这些参考示例。这就是最轻量的“进化”。7. 代码实现搭建 Harness 核心框架7.1 工具注册与调用学习助手需要工具但工具调用不能是无限自由的否则 Agent 会乱跑。Harness 的工具层负责两件事声明工具参数结构、按 Agent 的意图执行工具并返回结果。import json from typing import Any, Callable, Dict class ToolRegistry: 注册和管理 Agent 可调用的外部工具。 def __init__(self): self._tools: Dict[str, Callable] {} self._schemas: Dict[str, Dict[str, Any]] {} def register(self, name: str, schema: Dict[str, Any]): def decorator(func: Callable): self._tools[name] func self._schemas[name] schema return func return decorator def call(self, name: str, arguments: Dict[str, Any]) - str: if name not in self._tools: return json.dumps({error: f未注册工具 {name}}, ensure_asciiFalse) try: result self._tools[name](**arguments) return json.dumps(result, ensure_asciiFalse) except Exception as exc: return json.dumps({error: str(exc)}, ensure_asciiFalse)7.2 具体的学习工具实现定义两个和学习助手强相关的工具生成习题、检索知识点。这里检索知识点用最简单的关键词匹配示意正式项目可以替换成向量检索库。from harness.tools import ToolRegistry tool_registry ToolRegistry() tool_registry.register( generate_quiz, { type: object, properties: { topic: {type: string, description: 知识点名称}, difficulty: {type: string, enum: [easy, medium, hard]}, }, required: [topic, difficulty], }, ) def generate_quiz(topic: str, difficulty: str medium) - dict: 按知识点生成一道练习题简化版。 quiz_templates { easy: 请解释 {} 的基本概念。, medium: 请用 {} 解决一个实际问题并说明思路。, hard: 分析 {} 在真实工程中的优缺点给出你的判断。, } template quiz_templates.get(difficulty, quiz_templates[medium]) return {topic: topic, difficulty: difficulty, question: template.format(topic)} tool_registry.register( search_knowledge, { type: object, properties: { query: {type: string, description: 查询内容}, }, required: [query], }, ) def search_knowledge(query: str) - dict: 从本地知识库检索相关片段简化版。 knowledge_base { python: Python 是一种解释型、面向对象的编程语言适合快速开发。, 上下文工程: 上下文工程是设计和优化模型输入信息的技术。, harness: Harness 是围绕 Agent 的执行控制框架。, } result [] for key, value in knowledge_base.items(): if key in query or query in key: result.append(value) return {query: query, results: result}7.3 Agent 执行循环这个类是 Harness 的核心。它把大模型当作“决策器”让模型决定调用哪个工具然后根据工具结果继续推理直到生成最终回复。from openai import OpenAI from harness.context import HarnessContext from harness.tools import tool_registry class StudyAgent: def __init__(self, client: OpenAI, model_name: str): self.client client self.model_name model_name self.context HarnessContext() self.system_prompt ( 你是一个学习助手。你需要根据用户问题合理调用工具。 当用户需要题目时调用 generate_quiz 当需要知识解释时调用 search_knowledge。 工具调用结果请以 JSON 格式输出格式为 {tool: 工具名, arguments: {}}。 ) def run(self, user_input: str) - str: self.context.add_turn(user, user_input) messages self.context.build_messages(self.system_prompt) response self.client.chat.completions.create( modelself.model_name, messagesmessages, temperature0.3, ) content response.choices[0].message.content # 判断模型是否需要调用工具这里用简单关键字识别 if generate_quiz in content or search_knowledge in content: tool_result self._parse_and_call_tool(content) self.context.add_turn(assistant, content) self.context.add_turn(system, f工具返回结果{tool_result}) second_response self.client.chat.completions.create( modelself.model_name, messagesself.context.build_messages(self.system_prompt), ) final_answer second_response.choices[0].message.content self.context.add_turn(assistant, final_answer) return final_answer self.context.add_turn(assistant, content) return content def _parse_and_call_tool(self, content: str) - str: import json import re match re.search(r\{.*\}, content, re.S) if not match: return {error: 无法解析工具调用} try: action json.loads(match.group()) return tool_registry.call(action[tool], action[arguments]) except Exception as exc: return f{{error: {exc}}}这个循环是从“模型直接回答”到“模型使用工具”的关键一步。你可以看到 Harness 在这里做的不是复杂推理而是把“工具调用协议”和“上下文写入”标准化了。只要工具协议稳定模型就不容易跑偏。8. 学习助手功能模块实现8.1 知识问答模块知识问答的核心不是生成回答而是怎么让回答更准确。Harness 的做法先检索知识库把检索结果注入上下文再让模型基于注入内容回答。def ask_question(agent: StudyAgent, question: str) - str: knowledge_docs [上下文工程是设计模型输入信息的关键方法。] agent.context.inject_knowledge(knowledge_docs) return agent.run(question)实际项目应该通过向量检索引擎构建知识库而不是硬编码列表。这里用硬编码是为了把 Harness 的流程讲清楚。8.2 习题生成模块习题生成需要工具。模型先调用generate_quiz拿到题目模板再结合用户知识点做润色。批量生成五道题时循环调用工具并收集结果。def generate_quiz_batch(topic: str, count: int 5) - list: tasks [] for i in range(count): result tool_registry.call( generate_quiz, {topic: topic, difficulty: easy if i 2 else medium}, ) tasks.append(result) return tasks8.3 错题分析与讲解错题分析是学习助手最有价值的功能。Harness 在这里要做的是把用户的错题输入、当前薄弱点、知识库资料一起塞入上下文然后要求模型生成“诊断 讲解 练习建议”的结构化输出。为了让输出稳定建议在提示词里强制 JSON 结构DIAGNOSE_PROMPT ( 你是学习诊断助手。请根据错题记录输出 JSON格式为 {root_cause: 根因, explain: 详细讲解, practice_advice: 练习建议} )这一步体现的是上下文工程中的“输出约束”。模型输出一旦结构化后续就能直接进入业务系统不用再做二次解析。9. 功能测试与效果验证9.1 基础问答测试第一次跑通时建议先用最简单的输入测试client OpenAI(api_keysk-xxx, base_urlhttps://api.your-llm-provider.com/v1) agent StudyAgent(clientclient, model_nameyour-model-name) print(agent.run(自然语言处理里上下文窗口越大越好吗))判断标准是回答内容与注入的知识库片段一致而不是模型凭空发挥。如果发现模型忽略了注入的知识说明上下文工程里的“知识来源标记”还不够强需要在提示词里增加“请优先使用知识参考内容”。9.2 工具调用测试测试工具调用时可以主动让模型“生成一道 Python 相关的简单题”。预期输出是模型先输出工具调用请求Harness 捕获并执行工具再把结果交给模型生成最终回答。常见失败现象是模型直接自己写题不调用工具。这说明系统提示词里对工具的说明不够明确。改进方式是减少可选工具数量并在提示词里给出一个明确的工具调用示例。9.3 对照实验验证 Harness 有没有用为了验证 Harness 的价值最有效的方法是做对照实验。同样一个问题分别用“直接调用模型”和“通过 Harness 调用模型”跑 20 次记录输出格式正确率和答案相关性。测试方式输出格式稳定性回答相关性工具调用成功率直接调用模型不稳定一般不支持通过 Harness 调用较高较高可控制这个表是一个典型的预期结果。真正落地时建议把评分维度拆得更细知识准确率、题目可用率、讲解清晰度、格式合规率。9.4 判断标准问答模块回答中是否引用了注入的知识内容。习题模块输出题目是否与知识点强相关难度是否符合预期。诊断模块能否输出 JSON 结构且解析成功。自进化模块保存经验后第二轮的 few-shot 是否让输出更稳定。10. 接口 API 与批量任务10.1 使用 FastAPI 暴露学习助手服务实际使用时学习助手要接入 App 或 Web 页面所以需要 API 服务。这里用 FastAPI 做一层封装。from fastapi import FastAPI from pydantic import BaseModel app FastAPI(titleStudy Harness API) class AskRequest(BaseModel): question: str class QuizRequest(BaseModel): topic: str count: int 5 agent StudyAgent( clientOpenAI(api_keysk-xxx, base_urlhttps://api.your-llm-provider.com/v1), model_nameyour-model-name, ) app.post(/ask) def ask(req: AskRequest): answer ask_question(agent, req.question) return {answer: answer} app.post(/quiz) def quiz(req: QuizRequest): items generate_quiz_batch(req.topic, req.count) return {items: items}启动命令uvicorn app:app --host 127.0.0.1 --port 7860访问地址http://127.0.0.1:7860/docs这个地址可以直接在浏览器里测试接口。10.2 调用接口示例import requests url http://127.0.0.1:7860/ask payload {question: 什么是 Harness} response requests.post(url, jsonpayload, timeout120) print(response.json())注意timeout需要设置大一些因为多轮工具调用可能耗时较长。如果超时报错优先检查模型 API 的返回速度和网络状况。10.3 批量任务设计批量任务适合用在两个场景批量生成题目、批量分析错题。核心思路是读入 JSONL 任务文件逐条处理结果写入输出文件并为每条任务增加重试机制。import json import time INPUT_FILE ./datasets/tasks.jsonl OUTPUT_FILE ./outputs/results.jsonl MAX_RETRY 3 def process_task(task: dict) - dict: if task[type] quiz: result tool_registry.call( generate_quiz, {topic: task[topic], difficulty: task.get(difficulty, medium)}, ) return {task_id: task[task_id], result: result} def run_batch(): with open(INPUT_FILE, encodingutf-8) as fin, open( OUTPUT_FILE, w, encodingutf-8 ) as fout: for line in fin: task json.loads(line) for attempt in range(MAX_RETRY): try: output process_task(task) fout.write(json.dumps(output, ensure_asciiFalse) \n) break except Exception as exc: if attempt MAX_RETRY - 1: fout.write( json.dumps( {task_id: task[task_id], error: str(exc)} ) \n ) else: time.sleep(2 ** attempt) if __name__ __main__: run_batch()这个批量任务设计的重点是任务文件与结果文件分离、失败自动重试、错误任务不阻塞整体流程。这些都是在真实 Harness 工程里必须处理的细节。11. 资源占用与性能观察11.1 Token 消耗观察Harness 框架会明显增加 Token 消耗因为多轮工具调用、上下文注入、经验回放都会占用上下文窗口。建议在每次 API 调用后打印 usage 数据response client.chat.completions.create(modelmodel_name, messagesmessages) print(本次调用 token 数, response.usage.total_tokens)如果发现单次任务 Token 消耗过高优先检查是不是注入的知识库内容太长。可以选择只注入得分最高的前三段内容。11.2 上下文膨胀问题学习助手长时间使用后对话历史会不断膨胀。Harness 里的解决方案是摘要压缩。当上下文超过阈值调用一次模型把旧对话压缩成摘要然后保留摘要作为新对话的起点。def summarize_old_turns(old_turns: list) - str: prompt 将以下对话压缩成 200 字以内的学习进度摘要\n json.dumps( old_turns, ensure_asciiFalse ) summary client.chat.completions.create( modelmodel_name, messages[{role: user, content: prompt}], ) return summary.choices[0].message.content11.3 延迟观察Harness 的每轮工具调用都会增加一次模型请求整体响应时间通常是直接调用模型的 2 到 3 倍。所以在面向用户的学习助手场景里建议给工具调用环节设置超时并在前端做流式输出避免用户等待无反馈。11.4 如何降低消耗知识检索只返回最相关的前 2 到 3 条。工具调用结果写入上下文前先裁剪过长字段。对同一用户的请求做缓存相同知识点不重复生成。批量任务在低峰期执行避免 API 限流。12. 常见问题与排查方法问题现象可能原因排查方式解决方案模型不调用工具直接回答系统提示词缺少示例打印 system prompt确认工具说明是否清晰在提示词中增加一个完整的工具调用示例工具调用解析失败模型输出不符合预期格式打印原始 content 查看改用严格的 JSON 输出指令或接一层输出校验回答内容偏离注入知识点知识注入位置不突出检查 messages 里知识内容的顺序把知识内容放到 user 消息开头并明确告知模型优先参考上下文越来越长费用增加没有做对话压缩观察 usage.total_tokens 增长曲线加入摘要压缩机制批量任务卡住单条任务请求超时查看日志中卡住的任务 ID为单条任务设置 timeout 和重试次数端口被占用本地服务启动冲突查看启动日志报错更换端口如--port 7861自进化后效果反而变差把失败示例当成了成功示例检查评分规则和存储条件提高评分阈值并增加人工抽检如果拿到的 Harness 项目自带 Web 管理台依赖安装卡住前端依赖下载失败或版本不一致观察 pnpm/npm 安装日志先检查 Node 版本再清除缓存重装依赖13. 最佳实践与合规提醒13.1 工程化建议第一次做 Harness 项目时先不要追求功能多先跑通一个最小闭环用户提问 - 注入知识 - 模型回答 - 保存经验。这个闭环稳定后再逐步加入工具调用、批量任务和自进化。模型的输出校验一定要尽早做。Harness 的价值不在于让模型“永远正确”而在于让模型“错误可控、输出可解析”。所以每个工具调用结果都要有 JSON 校验失败的请求要能自动重试或降级。批量任务必须加日志。每次任务开始、结束、失败、重试都要记录否则一旦跑了一百条任务后出问题你很难定位是哪一步出的错。13.2 自进化的安全边界不要让“自进化”变成“失控修改”。在设计经验回放系统时建议遵循几个原则只能更新 few-shot 示例库和可选的检索策略不允许改写系统提示词核心规则。新经验需要达到评分阈值才允许进入示例库。定期人工抽检进化的示例防止模型自己强化了错误模式。13.3 隐私与版权学习助手涉及学生数据和学习内容需要严格遵守相关隐私要求。用户学习记录必须脱敏存储不能发送给模型服务的原始日志。题库、教材等资源如果来自第三方要确认你有使用权不能直接把版权资料塞进知识库对外服务。如果是教学场景的批量生成内容生成后应该做人工复核再交给最终用户避免出现错误知识误导学习者。14. 总结与下一步这个案例完整展示了 Harness 的落地路径从概念拆解到需求分析再到上下文管理、工具调用、自进化机制和批量任务设计。最值得尝试的是 HarnessContext 和 ExperienceReplay 这两个模块它们代码量不大但直接解决了 Agent 开发里最让人头疼的问题上下文不可控、经验不可复用。最先应该验证的功能是“工具调用闭环”也就是让模型学会调用generate_quiz。这个功能一旦跑通说明 Harness 的协议和控制机制生效了后面的扩展都建立在它之上。最容易踩的坑是上下文膨胀。很多 Agent 项目前期跑得不错用一段时间后输出质量突然下降大概率是历史消息堆积把关键信息挤出了模型的有效注意力范围。建议从第一天就加入摘要压缩逻辑不要等出了问题再补。后续可以继续扩展几个方向把知识检索换成向量数据库让学习助手支持真正的长文档问答把经验回放接入评估指标实现更系统的效果优化把 FastAPI 服务替换成异步框架支撑更高并发。建议先下载或新建一个最小项目把 HarnessContext 和 ToolRegistry 跑通再逐步丰富学习助手的功能。直接看代码比只看概念有用得多。