AI PRO·Harness Day 2 六层架构详解

作者:

深入理解Harness的六层架构 · 每层的职责与设计原则


引言:为什么是六层?

在上一篇中,我们介绍了Harness Engineering的核心公式:

`

Agent = Model + Harness

`

Harness是围绕AI模型构建的所有系统、工具、配置和基础设施。但Harness具体包含什么?

经过OpenAI、Anthropic、LangChain等大厂的实践总结,Harness可以分为六层

`

┌─────────────────────────────────────┐

│ 6. Observability(可观测性) │

├─────────────────────────────────────┤

│ 5. Eval(评估) │

├─────────────────────────────────────┤

│ 4. Memory(记忆) │

├─────────────────────────────────────┤

│ 3. Tool(工具) │

├─────────────────────────────────────┤

│ 2. Context(上下文) │

├─────────────────────────────────────┤

│ 1. Prompt(提示词) │

└─────────────────────────────────────┘

`

本篇将深入讲解每层的职责、设计原则和实际案例。


第一层:Prompt(提示词)

2.1 职责

Prompt层:告诉AI”做什么”和”怎么做”。

核心问题

  • 任务目标是什么?
  • 输出格式是什么?
  • 有什么约束条件?

2.2 设计原则

原则1:明确具体

`

❌ 错误:帮我写一篇文章

✅ 正确:写一篇1000字的Python教程,目标读者是初学者,包含代码示例

`

原则2:结构化指令

`markdown

任务

写一个Python函数

要求

  • 输入:字符串列表
  • 输出:去重后的列表
  • 约束:保持原有顺序

示例

输入:[“a”, “b”, “a”, “c”]

输出:[“a”, “b”, “c”]

`

原则3:约束边界

`

注意:

  • 不要编造数据
  • 不要使用外部库
  • 代码必须可运行

`

2.3 常见模式

1. 角色设定

`

你是一个Python专家,擅长写简洁高效的代码。

`

2. 任务分解

`

请按以下步骤完成:

  1. 分析需求
  2. 设计算法
  3. 编写代码
  4. 添加注释

`

3. 输出格式

`

请按以下格式输出:

`python

# 函数说明

def function_name():

# 实现

`

`

2.4 实际案例

案例:代码审查Prompt

`markdown

角色

你是一个资深Python开发者,负责代码审查。

任务

审查以下代码,找出潜在问题。

审查维度

  1. 代码风格(PEP 8)
  2. 性能问题
  3. 安全漏洞
  4. 错误处理

输出格式

问题列表

  • [行号] 问题描述
  • 严重程度:高/中/低
  • 建议:如何修复

总体评价

  • 代码质量:X/10
  • 主要优点:…
  • 主要问题:…

`


第二层:Context(上下文)

3.1 职责

Context层:给AI提供完成任务需要的信息。

核心问题

  • 需要哪些背景信息?
  • 如何组织这些信息?
  • 如何控制上下文长度?

3.2 设计原则

原则1:相关信息优先

`

❌ 错误:把所有文档都塞进去

✅ 正确:只放与当前任务相关的信息

`

原则2:结构化组织

`markdown

项目背景

这是一个Web应用,使用Python Flask框架。

当前任务

修复登录功能的bug。

相关代码

`python

# auth.py

def login(username, password):

# …

`

错误信息

TypeError: login() missing 1 required positional argument

`

原则3:控制长度

  • 短上下文:直接放入
  • 长上下文:使用RAG检索
  • 超长上下文:分块处理

3.3 上下文来源

来源 说明 示例

|——|——|——|

用户输入 用户的请求和问题 “修复这个bug”
系统信息 当前环境和状态 操作系统、Python版本
历史记录 之前的对话和操作 之前的代码修改
知识库 文档和参考资料 API文档、代码规范
外部数据 实时获取的信息 数据库查询结果

3.4 RAG(检索增强生成)

RAG:从知识库中检索相关信息,作为上下文提供给AI。

流程

`

用户问题 → 检索相关文档 → 组装上下文 → AI生成答案

`

示例

`python

def rag_query(question):

# 1. 检索相关文档

docs = vector_store.search(question, top_k=3)

# 2. 组装上下文

context = “nn”.join([doc.content for doc in docs])

# 3. 生成答案

prompt = f”””

根据以下参考资料回答问题:

参考资料:

{context}

问题:{question}

“””

return llm.generate(prompt)

`

3.5 实际案例

案例:代码助手的上下文设计

`python

class CodeAssistantContext:

def build_context(self, user_request):

context = {

# 1. 用户请求

“request”: user_request,

# 2. 当前文件

“current_file”: self.get_current_file(),

# 3. 相关文件

“related_files”: self.find_related_files(user_request),

# 4. 项目结构

“project_structure”: self.get_project_structure(),

# 5. 代码规范

“coding_standards”: self.get_coding_standards(),

# 6. 历史修改

“recent_changes”: self.get_recent_changes()

}

return self.format_context(context)

`


第三层:Tool(工具)

4.1 职责

Tool层:给AI提供执行任务的能力。

核心问题

  • AI需要哪些能力?
  • 如何调用这些能力?
  • 如何处理调用结果?

4.2 设计原则

原则1:明确工具职责

`python

# ✅ 好的设计:每个工具做一件事

@tool

def read_file(path: str) -> str:

“””读取文件内容”””

pass

@tool

def write_file(path: str, content: str) -> bool:

“””写入文件内容”””

pass

# ❌ 坏的设计:一个工具做太多事

@tool

def manage_file(action: str, path: str, content: str = None):

“””管理文件(读取、写入、删除)”””

pass

`

原则2:清晰的接口定义

`python

@tool

def search_web(query: str, num_results: int = 5) -> list:

“””

搜索网络信息

Args:

query: 搜索关键词

num_results: 返回结果数量,默认5

Returns:

搜索结果列表,每个结果包含title和url

Example:

>>> search_web(“Python教程”, 3)

[{“title”: “…”, “url”: “…”}, …]

“””

pass

`

原则3:错误处理

`python

@tool

def read_file(path: str) -> str:

“””读取文件内容”””

try:

with open(path, ‘r’) as f:

return f.read()

except FileNotFoundError:

return f”错误:文件 {path} 不存在”

except PermissionError:

return f”错误:没有权限读取文件 {path}”

`

4.3 工具类型

类型 说明 示例

|——|——|——|

文件操作 读写文件 read_file, write_file
代码执行 运行代码 run_python, run_shell
网络请求 调用API http_get, http_post
数据库 查询数据 sql_query, redis_get
搜索 检索信息 search_web, search_docs
计算 数学运算 calculate, statistics

4.4 MCP(Model Context Protocol)

MCP:Anthropic提出的标准化工具调用协议。

核心思想:统一AI调用外部工具的接口。

MCP架构

`

AI模型 ←→ MCP客户端 ←→ MCP服务器 ←→ 外部工具

`

MCP示例

`json

{

“name”: “read_file”,

“description”: “读取文件内容”,

“inputSchema”: {

“type”: “object”,

“properties”: {

“path”: {

“type”: “string”,

“description”: “文件路径”

}

},

“required”: [“path”]

}

}

`

4.5 实际案例

案例:代码助手的工具设计

`python

class CodeAssistantTools:

def __init__(self):

self.tools = {

“read_file”: self.read_file,

“write_file”: self.write_file,

“run_code”: self.run_code,

“search_code”: self.search_code,

“git_status”: self.git_status,

“git_commit”: self.git_commit

}

def execute_tool(self, tool_name, **kwargs):

if tool_name not in self.tools:

return f”错误:未知工具 {tool_name}”

try:

return self.toolstool_name

except Exception as e:

return f”错误:{str(e)}”

`


第四层:Memory(记忆)

5.1 职责

Memory层:让AI记住信息,跨越多次对话。

核心问题

  • 记住什么?
  • 记多久?
  • 如何检索?

5.2 设计原则

原则1:分层存储

`

短期记忆(对话内) → 当前对话的上下文

中期记忆(会话内) → 当前会话的历史

长期记忆(持久化) → 跨会话的知识

`

原则2:结构化存储

`python

memory = {

“user_preferences”: {

“language”: “Python”,

“style”: “简洁”,

“level”: “中级”

},

“project_context”: {

“name”: “my-app”,

“framework”: “Flask”,

“database”: “PostgreSQL”

},

“conversation_history”: [

{“role”: “user”, “content”: “…”},

{“role”: “assistant”, “content”: “…”}

]

}

`

原则3:智能检索

`python

def retrieve_memory(query):

# 1. 搜索相关记忆

relevant = search_memory(query)

# 2. 按相关性排序

ranked = rank_by_relevance(relevant, query)

# 3. 返回top-k

return ranked[:5]

`

5.3 记忆类型

类型 说明 存储方式 示例

|——|——|———-|——|

工作记忆 当前任务的状态 内存 当前变量值
情景记忆 具体事件和经历 数据库 上次对话内容
语义记忆 知识和概念 向量数据库 Python语法
程序记忆 技能和方法 代码 如何写函数

5.4 向量数据库

向量数据库:存储和检索语义相似的信息。

工作流程

`

文本 → Embedding → 向量 → 存储 → 检索 → 相似度计算 → 返回结果

`

常用向量数据库

  • Chroma(轻量级)
  • Pinecone(云服务)
  • Weaviate(开源)
  • Milvus(高性能)

5.5 实际案例

案例:代码助手的记忆系统

`python

class CodeAssistantMemory:

def __init__(self):

self.short_term = {} # 当前对话

self.long_term = VectorDB() # 持久化存储

def remember(self, key, value, persist=False):

“””存储记忆”””

self.short_term[key] = value

if persist:

self.long_term.store(key, value)

def recall(self, query):

“””检索记忆”””

# 1. 先查短期记忆

if query in self.short_term:

return self.short_term[query]

# 2. 再查长期记忆

results = self.long_term.search(query)

if results:

return results[0]

return None

def forget(self, key):

“””删除记忆”””

if key in self.short_term:

del self.short_term[key]

`


第五层:Eval(评估)

6.1 职责

Eval层:检查AI的输出是否符合预期。

核心问题

  • 如何定义”好”?
  • 如何自动评估?
  • 如何持续改进?

6.2 设计原则

原则1:多维度评估

`python

evaluation = {

“correctness”: 0.9, # 正确性

“completeness”: 0.8, # 完整性

“quality”: 0.85, # 质量

“efficiency”: 0.7, # 效率

“safety”: 1.0 # 安全性

}

`

原则2:自动化测试

`python

def evaluate_code(code):

results = {

“syntax_check”: check_syntax(code),

“style_check”: check_style(code),

“test_results”: run_tests(code),

“performance”: measure_performance(code)

}

return results

`

原则3:持续改进

`

评估 → 发现问题 → 改进Prompt/Context/Tool → 再评估

`

6.3 评估方法

方法 说明 适用场景

|——|——|———-|

规则检查 用规则验证输出 格式、语法检查
自动化测试 运行测试用例 代码功能测试
LLM评估 用AI评估AI 内容质量评估
人工抽查 人工验证 高风险任务
A/B测试 对比不同方案 优化选择

6.4 评估指标

代码评估

  • 测试通过率
  • 代码覆盖率
  • 性能指标
  • 安全漏洞数

内容评估

  • 准确性
  • 完整性
  • 可读性
  • 原创性

对话评估

  • 回答准确率
  • 用户满意度
  • 响应时间
  • 解决率

6.5 实际案例

案例:代码助手的评估系统

`python

class CodeAssistantEval:

def evaluate(self, code, requirements):

results = {}

# 1. 语法检查

results[“syntax”] = self.check_syntax(code)

# 2. 测试执行

results[“tests”] = self.run_tests(code)

# 3. 代码风格

results[“style”] = self.check_style(code)

# 4. 性能分析

results[“performance”] = self.analyze_performance(code)

# 5. 安全扫描

results[“security”] = self.scan_security(code)

# 6. 计算总分

results[“total_score”] = self.calculate_score(results)

return results

def calculate_score(self, results):

weights = {

“syntax”: 0.2,

“tests”: 0.3,

“style”: 0.1,

“performance”: 0.2,

“security”: 0.2

}

score = 0

for key, weight in weights.items():

score += results[key].get(“score”, 0) * weight

return score

`


第六层:Observability(可观测性)

7.1 职责

Observability层:监控和调试整个系统。

核心问题

  • 系统运行状态如何?
  • 问题出在哪里?
  • 如何优化性能?

7.2 设计原则

原则1:全链路追踪

`

用户请求 → Prompt → Context → Model → Tool → 结果

↓ ↓ ↓ ↓ ↓ ↓

trace trace trace trace trace trace

`

原则2:结构化日志

`python

log = {

“timestamp”: “2026-06-25T10:00:00Z”,

“trace_id”: “abc123”,

“span_id”: “span456”,

“operation”: “generate_code”,

“input”: {“prompt”: “…”, “context”: “…”},

“output”: {“code”: “…”},

“metrics”: {

“latency_ms”: 1500,

“tokens_used”: 500,

“cost_usd”: 0.01

}

}

`

原则3:实时告警

`python

alerts = [

{

“condition”: “latency > 5000ms”,

“action”: “notify_oncall”

},

{

“condition”: “error_rate > 10%”,

“action”: “rollback”

}

]

`

7.3 可观测性三支柱

支柱 说明 工具

|——|——|——|

日志(Logs) 记录事件和错误 ELK, Loki
指标(Metrics) 量化性能数据 Prometheus, Grafana
追踪(Traces) 追踪请求链路 Jaeger, Zipkin

7.4 关键指标

性能指标

  • 响应时间(Latency)
  • 吞吐量(Throughput)
  • 错误率(Error Rate)

成本指标

  • Token使用量
  • API调用次数
  • 计算资源消耗

质量指标

  • 用户满意度
  • 任务完成率
  • 结果准确率

7.5 实际案例

案例:代码助手的监控系统

`python

class CodeAssistantObservability:

def __init__(self):

self.logger = Logger()

self.metrics = Metrics()

self.tracer = Tracer()

def trace_operation(self, operation_name):

“””追踪操作”””

def decorator(func):

def wrapper(*args, **kwargs):

# 开始追踪

span = self.tracer.start_span(operation_name)

try:

# 执行操作

result = func(*args, **kwargs)

# 记录成功

span.set_status(“OK”)

self.metrics.increment(f”{operation_name}.success”)

return result

except Exception as e:

# 记录失败

span.set_status(“ERROR”)

span.set_attribute(“error”, str(e))

self.metrics.increment(f”{operation_name}.error”)

raise

finally:

# 结束追踪

span.end()

return wrapper

return decorator

def record_metrics(self, operation, metrics):

“””记录指标”””

self.metrics.record(operation, metrics)

# 检查告警

self.check_alerts(operation, metrics)

`


层与层的关系

8.1 数据流

`

用户请求

[1. Prompt] → 明确任务和约束

[2. Context] → 提供相关信息

[3. Tool] → 调用外部能力

[4. Memory] → 检索历史记忆

[Model] → AI模型处理

[5. Eval] → 评估输出质量

[6. Observability] → 记录和监控

返回结果

`

8.2 依赖关系

`

Observability ← 依赖所有层

Eval ← 依赖Prompt、Context、Tool

Memory ← 独立存储

Tool ← 依赖Context

Context ← 依赖Prompt

Prompt ← 基础层

`

8.3 设计顺序

推荐设计顺序

`

  1. Prompt → 先明确任务
  2. Context → 再提供信息
  3. Tool → 然后扩展能力
  4. Memory → 接着积累知识
  5. Eval → 之后保证质量
  6. Observability → 最后监控优化

`


设计模板

9.1 Harness设计模板

`markdown

# Harness设计文档

1. 任务定义(Prompt)

  • 任务目标:
  • 输出格式:
  • 约束条件:

2. 上下文设计(Context)

  • 信息来源:
  • 组织方式:
  • 长度控制:

3. 工具设计(Tool)

  • 必需工具:
  • 可选工具:
  • 接口定义:

4. 记忆设计(Memory)

  • 存储内容:
  • 存储方式:
  • 检索策略:

5. 评估设计(Eval)

  • 评估维度:
  • 评估方法:
  • 质量标准:

6. 监控设计(Observability)

  • 监控指标:
  • 告警规则:
  • 日志格式:

`


下一讲预告

下一讲:《AI PRO·Harness Day 3:Prompt层设计》

我们将深入讲解:

  • Prompt Engineering的演进
  • 高级Prompt技巧
  • Prompt模板设计
  • 实际案例分析

参考资料

官方文档

中文资料


💡 一句话总结:六层架构是Harness Engineering的核心框架,理解每层的职责是设计好Harness的基础。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注