首页 / 文章 / 实用笔记:用 Rust 构建 AI 智能体——第二部分

实用笔记:用 Rust 构建 AI 智能体——第二部分

《实用笔记:用 Rust 构建 AI 智能体》操作指南——第二部分:针对采用该模式的团队提供的合约、校验机制以及可直接插入的代码模块。

2668 词

以下笔记为“用 Rust 构建 AI 智能体——第二部分”提供了实用的学习路径。重点在于契约、校验以及可直接插入的代码占位符,而非激励性叙述。 在完成概览阶段时,首先写下契约内容:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功校验标准,并杜绝无声的半完成状态。

为何结构在此处至关重要

在此处,“Why”结构很重要,将其视为可测量的对象能更好地发挥作用。在扩大范围之前,先记录一份优秀的测试用例、一个失败案例以及回滚说明。在功能结果旁还需记录执行时间以及令牌或查询成本。提前了解这些成本,就能避免在从演示环境过渡到共享环境时出现意外费用。要保持图表状态简洁且具有类型定义,嵌套的数据块会掩盖是哪个节点修改了哪个字段,还会在出现中断后导致流程无法继续。

四层结构

将这四层架构视为可测量的界面时,其效果最佳。在扩大范围之前,先记录一份成功的案例、一个失败案例以及回滚说明。 将配置置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放于一处,这样操作人员无需查看整个结构即可进行审计。 保持图结构的扁平化与类型化。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在出现中断后导致无法继续执行。

类型化构建器

将A类型构建阶段视为可度量的对象时,其效果最佳。在扩大范围之前,需记录一份理想运行案例、一个故障案例以及回滚说明。 同时记录正常流程与恢复流程。重试机制、人工审核环节以及死信处理都是产品本身的一部分,而非后续需要补充的内容。 保持图结构简洁且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致无法继续处理。 将A类型构建阶段视为输入与已验证输出之间的契约。为相关产物命名,定义成功判定标准,绝不允许出现无声的半完成状态。

let prompt = SystemPromptBuilder::new()
    .identity("You are Eugene, a careful research assistant who answers \
               questions about a Rust project. You prefer reading the source \
               over guessing.")
    .instruction("Use `list_files` to discover what is in the project before reading.")
    .instruction("Use `read_file` to inspect a specific file. Do not call it on \
                  paths you have not seen listed.")
    .instruction("If a tool returns an error, do not retry the same call.")
    .output_constraints("Answer in plain prose. Cite the file you read in parentheses, \
                         for example: (src/main.rs).")
    .example("What edition does Cargo.toml use?",
             "I'll check Cargo.toml directly. (Cargo.toml) The project uses Rust edition 2024.")
    .context(format!("<env>\ntoday: {today}\nproject_root: {sandbox}\n</env>"))
    .build();
## Identity

You are Eugene, a careful research assistant ...

## Instructions

- Use `list_files` to discover what is in the project before reading.
- Use `read_file` to inspect a specific file. Do not call it on paths ...
- If a tool returns an error, do not retry the same call.

## Output

Answer in plain prose. Cite the file you read in parentheses ...

## Examples

Example 1:
User: What edition does Cargo.toml use?
Assistant: I'll check Cargo.toml directly. (Cargo.toml) ...
## Context

<env>
today: 2026-05-22
project_root: /Users/me/code/eugene
</env>

身份即声音,而非真相

由于身份标识是声音而非舞台,因此在修改代码之前需明确输入内容、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。应在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外账单。对于会耗费资金或修改生产数据的操作,必须经过人工审批。编译时的配置并不等同于业务功能的完整性。

说明应采用列表形式,而非散文

由于这些说明属于分阶段列表形式,因此在修改代码之前需明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一个位置,这样操作人员无需查看整个系统结构即可进行审核。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务功能的完整性。

输出约束使格式与行为分离

在处理输出约束时,应在修改代码之前分离格式处理阶段,明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程与异常恢复路径。重试机制、人工审核环节以及错误处理都是产品不可或缺的部分,而非后续需要补充的功能。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务功能的完整性。 在处理输出约束时,应在修改代码之前分离格式处理阶段,明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将此阶段视为输入与经过验证的输出之间的契约。为相关输出文件命名,明确成功判定标准,绝不允许出现无声无息的半完成状态。

少样本示例应通过演示而非解释来呈现

在处理“少样本示例通过演示展示”这一阶段时,首先需明确相关要求:所需输入、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在耗时较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的大型语言模型。

.example(
    "What edition does Cargo.toml use?",
    "I'll check Cargo.toml directly. (Cargo.toml) The project uses Rust edition 2024.",
)

每次请求的上下文都是全新的

在处理“上下文新鲜”阶段的任务时,首先写下相关约定:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 将配置信息与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中于一个位置,这样操作人员无需查看整个系统结构即可进行审计。 在耗时较高的步骤之后设置检查点。当操作人员重新执行后续节点时,恢复流程不应再次调用相同的大型语言模型。

let today = OffsetDateTime::now_utc()
    .date()
    .format(&Iso8601::DATE)
    .unwrap_or_else(|_| "unknown".into());
let sandbox = sandbox_root()?.display().to_string();

let prompt = system_prompt(&today, &sandbox);

缓存边界

在处理缓存边界阶段时,首先需明确相关约定:所需的输入参数、成功信号以及部分失败时的处理方式。这份清单能确保后续的代码修改保持一致性。 同时记录正常流程与异常恢复路径。重试机制、人工审核环节以及死信处理都是产品功能的一部分,而非后续需要补充的内容。 在成本较高的步骤之后设置检查点。当操作员重新尝试某个节点时,恢复流程不应再次调用相同的大型语言模型。 在处理缓存边界阶段时,首先需明确相关约定:所需的输入参数、成功信号以及部分失败时的处理方式。这份清单能确保后续的代码修改保持一致性。 将此阶段视为输入与验证后输出之间的契约。为相关成果命名,定义成功判定标准,并杜绝无声的半完成状态。

let blocks = prompt.into_system_blocks();
// blocks[0] = { type: "text", text: <static prefix>, cache_control: {type: "ephemeral"} }
// blocks[1] = { type: "text", text: <dynamic suffix> }   // no cache_control
[turn 0] in=4 cache_read=0 cache_create=1247 out=89
[turn 1] in=3 cache_read=1247 cache_create=0 out=42

章节记忆化:一次计算,多次复用

当将阶段性记忆计算视为可度量的对象时,其在仅执行一次的情况下效果最佳。在扩大范围之前,需记录一份理想的运行结果、一个故障案例以及回滚说明。应在功能结果旁同时记录执行时间以及令牌或查询成本。提前了解这些成本,就能避免在从演示环境过渡到共享环境时出现意外费用。需保持图结构的状态简洁且具有明确类型;嵌套的数据块会掩盖是哪个节点修改了哪个字段,还会在中断后导致程序无法继续运行。

版本控制与回归测试

将版本控制与回归测试阶段视为可度量的对象,才能发挥最佳效果。在扩大范围之前,先记录一份标准测试用例、一个故障案例以及回滚说明。 将配置信息与应用程序代码分开。环境文件、密钥存储和功能开关应集中存放,以便操作人员无需查看整个结构就能进行审计。 保持数据结构的层次简单且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致流程无法继续。

const EXPECTED_PROMPT_FINGERPRINT: u64 = 0; // set after first successful run

if EXPECTED_PROMPT_FINGERPRINT != 0
    && prompt.fingerprint() != EXPECTED_PROMPT_FINGERPRINT
{
    eprintln!(
        "warning: system prompt fingerprint drifted (was {EXPECTED_PROMPT_FINGERPRINT}, \
         is {}). Update the constant if the change was intentional.",
        prompt.fingerprint()
    );
}

Eugene v0.2 的实际应用

Eugene v0 2 在测试阶段时,若将其视为可度量的对象来处理效果最佳。在扩大范围之前,需记录一份理想状态下的运行日志、一个故障案例以及回滚说明。 同时记录正常流程与恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的一部分,而非后续需要补充的内容。 保持图表状态简洁且类型明确。嵌套的数据结构会掩盖具体是哪个节点修改了哪个字段,还会在流程中断后导致无法继续执行。 Eugene v0 2 在测试阶段时,若将其视为可度量的对象来处理效果最佳。在扩大范围之前,需记录一份理想状态下的运行日志、一个故障案例以及回滚说明。 应将此测试阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,绝不允许出现无声无息的半完成状态。

let prompt = system_prompt(&today, &sandbox);
let system_blocks = prompt.into_system_blocks();

let response = send(&http, &api_key, &system_blocks, &tools, &messages).await?;

这揭示了什么

在“这揭示了什么”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。应在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。对于会耗费资金或修改生产数据的操作,必须经过人工审批。编译时的配置并不等同于业务功能的完整性。

下一步是什么

在“下一步做什么”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一个位置,以便操作人员无需查看整个流程即可进行审计。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务流程的完整性。

工作空间

在workspace阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程与异常恢复路径。重试机制、人工审核环节以及错误处理都是产品不可或缺的部分,而非后续需要补充的内容。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。仅靠编译时的配置并不足以保证业务的完整性。 在workspace阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功判定标准,绝不允许出现无声无息的半完成状态。

相关主题

在处理“相关主题”阶段时,首先写下合约的详细内容:所需输入、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在耗时较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次收取相同的LLM调用费用。

代码

在处理代码阶段时,首先写下契约内容:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将配置信息与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中于一个位置,这样操作人员无需查看整个系统结构即可进行审计。 在耗时较高的步骤之后设置检查点。当操作人员重新执行后续节点时,恢复流程不应再次计费相同的大型语言模型调用。

想要更多类似内容?

在处理“需要更多类似内容”这一阶段时,首先写下相关契约:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。

操作检查清单

在制定操作检查清单阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏的状态。

优先选择小型且可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应能指向单一的责任主体,而非复杂的流程链。

对于会花费资金或修改生产数据的环节,必须经过人工审批。编译时的配置并不等同于业务上的完整性。

编写一份简短的操作手册:说明如何轮换密钥、如何清空队列、以及如何回滚上一次的处理结果。

将这一阶段视为输入数据与经过验证的输出数据之间的契约。为相关工件命名,明确成功标准,绝不允许出现悄无声息的半完成状态。

对于会花费资金或修改生产数据的环节,必须经过人工审批。编译时的配置并不等同于业务上的完整性。

在升级整个系统之前,先冻结现有版本,为关键流程保存一份标准参考记录,并确认好回滚步骤。共享环境需要设置速率限制、进行租户身份验证,同时要明确密钥轮换的责任人。与其追求花哨的一次性演示,不如注重扎实的可靠性。

bfb02d0288c5的批量处理说明:不要将提供者密钥放入代码仓库,设定单次会话的令牌上限,并将转录内容存储在评估测试用例旁边,以便后续更换模型时仍能保持可比性。

针对强化安全措施的第0阶段,在修改代码之前需明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误处理都属于产品功能的一部分,而非后续需要完善的内容。

强化安全措施细节0/858:需统计该步骤的运行时间、错误类型以及令牌消耗情况,然后依据固定的评估标准而非个人经验来决定是否保留该更改。

在处理强化措施的第一阶段时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改始终符合约定。 将这一阶段视为输入与验证后输出之间的契约。为相关产物命名,明确成功判定标准,杜绝默许部分完成的情况。

强化措施细节 1/858:需记录该步骤的耗时、错误类型以及令牌消耗情况,然后依据固定的评估标准而非个人经验来决定是否保留该修改。