文档完善
本项目用于参加”第三届中国研究生操作系统开源创新大赛”。当前包含:
docs/
docs/role_specification.md
docs/task_flow.md
docs/experiment_contract.md
纯文本模式是对照组,不代表最终优化方案。两种模式在相同任务集、 相同模型、相同参数和相同评测规则下运行,结果可直接比较。
测试任务 → Agent A → 自然语言消息(TextChannel) → Agent B → 最终结果 → 评测与指标记录
产出四类指标:Token 数量、端到端延迟、Agent 间消息数、最终结果正确率, 作为阶段二(结构化协议)、阶段三(共享内存/非文本状态传递)的对照基线。
对每条测试任务:
data/benchmark_tasks.jsonl
纯文本自然语言是多 Agent 系统最朴素的通信方式,也是本赛题所有优化 (结构化协议、非文本状态传递、共享记忆)要对比的基准。先把对照组 做稳、做可复现,后续每一项优化的收益才有可信的参照系。
AgentA.process(task) -> str
AgentB.handle(message) -> str
Agent 不做实验指标汇总;统计统一由 ExperimentRunner 和 MetricsRecorder 完成。
ExperimentRunner
MetricsRecorder
按六个维度记录:agent_a_input_tokens、agent_a_output_tokens、 agent_b_input_tokens、agent_b_output_tokens、message_tokens(Agent 间 消息单独统计,供阶段二对比)、total_model_tokens(四个模型端数值之和)。
agent_a_input_tokens
agent_a_output_tokens
agent_b_input_tokens
agent_b_output_tokens
message_tokens
total_model_tokens
usage
token_count_exact=true
token_count_exact=false
使用 time.perf_counter_ns() 高精度计时,单位毫秒:
time.perf_counter_ns()
agent_a_latency_ms
message_transfer_latency_ms
TextChannel.send()
agent_b_latency_ms
end_to_end_latency_ms
近似满足:端到端 ≈ A + 传输 + B + 运行器开销。
第一版口径:只统计 Agent 之间实际经过 TextChannel.send() 的消息。 Agent B 的最终结果直接交给实验运行器,不额外算一条消息,即每任务 1 条 (A→B)。如将配置 communication.count_return_message 设为 true, B→A 的回程结果消息也会入账,每任务记 2 条。
communication.count_return_message
true
accuracy = 正确任务数 / 总任务数。支持四种评测方式:
accuracy = 正确任务数 / 总任务数
exact_match
normalized_exact_match
contains
numeric_match
要求 Python ≥ 3.11(在 openEuler 24.03-LTS-SP3 自带 Python 3.11 上验证目标)。
# openEuler 如缺少 pip:dnf install python3-pip python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt pip install -e . # 以包形式安装 src/baseline,使 python -m baseline.main 可用
不想安装也可以用 PYTHONPATH=src python3 -m baseline.main ... 运行。
PYTHONPATH=src python3 -m baseline.main ...
实验参数集中在 configs/baseline.yaml(provider、模型名、温度、超时、 重试次数、消息统计口径、数据集路径、输出目录、随机种子等),命令行参数 可覆盖其中的 provider、repeat 和数据集。
configs/baseline.yaml
python -m baseline.main --config configs/baseline.yaml --provider mock
Mock 客户端对相同输入永远产生相同输出:Agent A 用固定模板转述任务, Agent B 用内置确定性规则引擎求解,无任何随机性,无网络依赖。
export LLM_API_KEY=sk-xxxx export LLM_BASE_URL=https://api.deepseek.com/v1 export LLM_MODEL=deepseek-chat python -m baseline.main --config configs/baseline.yaml --provider openai-compatible
参考 .env.example。密钥只从环境变量读取,不写入代码和配置。调用失败 (网络错误、超时、HTTP 错误、空响应)会抛出明确错误并记录到该条任务的 结果里,不会静默切换成 Mock 模式。
.env.example
常用参数:
python -m baseline.main --config configs/baseline.yaml --max-tasks 5 # 只跑前 5 条 python -m baseline.main --config configs/baseline.yaml --repeat 3 # 重复 3 轮
pytest -q
覆盖 TextChannel(类型约束、计数、内容不变、元数据)、Evaluator(四种 评测方式)、指标统计(Token 累加、延迟、消息数、正确率、P50/P95)、 ExperimentRunner(单任务全流程、多任务、失败隔离、文件输出)以及 “Mock 模式下基准任务集 100% 通过”的回归保护。
阶段二新增测试:消息模型与序列化一致性、Schema 校验(缺字段/未知 类型/未知动作/版本不符/缺 correlation_id 等均被拒绝)、RequestTracker (登记/关联/重复响应/未知关联/超时)、CapabilityRegistry 与路由 (注册/查询/注销/确定性多 Agent 路由)、任务状态机(合法与非法转换/ 取消/超时)、StructuredChannel(字节统计/校验先于执行/消息去重)、 文本回退(许可控制/原因记录/JSON 不进 LLM)、结构化集成与两种模式 对照实验(含对照报告生成)。
每轮运行在 outputs/ 生成三个文件:
outputs/
run_<时间戳>_<轮次>_details.jsonl
run_<时间戳>_<轮次>_summary.json
run_<时间戳>_<轮次>_details.csv
TextChannel
# 结构化模式(Mock,离线确定性) python -m baseline.main --config configs/structured.yaml --provider mock # 等价写法:用 --mode 覆盖任意配置 python -m baseline.main --config configs/baseline.yaml --mode structured_json # 对照实验:同一任务集依次运行两种模式并生成对照报告 python -m baseline.main --config configs/baseline.yaml --mode compare
通信模式也可用环境变量覆盖:BASELINE_COMMUNICATION_MODE=structured_json。
BASELINE_COMMUNICATION_MODE=structured_json
Planner(程序侧) → HELLO / CAPABILITY_REGISTER / CAPABILITY_QUERY(会话建立) 每条任务:TASK_REQUEST → TASK_ACCEPT → ACTION_REQUEST → ACTION_RESULT
parameters.task_text
llm_visible_tokens
control_plane_bytes
结构化模式除三个常规文件外多一个消息级明细 run_<时间戳>_<轮次>_structured_json_messages.jsonl; compare 模式额外生成 outputs/comparison_<时间戳>.{json,csv,md} 对照报告(Token 收益、字节开销、Schema/路由开销、质量变化, 全部来自实际实验数据)。
run_<时间戳>_<轮次>_structured_json_messages.jsonl
outputs/comparison_<时间戳>.{json,csv,md}
docs/protocol_spec.md
docs/field_dictionary.md
docs/error_codes.md
docs/routing_rules.md
docs/fallback_strategy.md
协议语义(baseline/protocol/)、编码(JSON)与传输 (baseline/communication/)严格解耦。UnixSocketTransport 已实现 (socket.socketpair(),Linux 上即 AF_UNIX;4 字节长度前缀 + JSON 帧),供 C/D 实验组使用;后续把 StructuredRuntime 的状态机/路由/ 关联逻辑迁往独立 Rust Runtime 进程时,业务 Agent、评测与指标模块 不修改(见 docs/rust_runtime_architecture.md)。
baseline/protocol/
baseline/communication/
UnixSocketTransport
socket.socketpair()
docs/rust_runtime_architecture.md
以下接口保持稳定:
AgentA.process(task) -> str AgentB.handle(message) -> str TextChannel.send(sender, receiver, content) -> str Transport.send(message) -> TransportResult StructuredChannel.send(message) -> StructuredMessage | None StructuredRuntime.dispatch(message) -> StructuredMessage | None Evaluator.evaluate(prediction, expected, evaluation_type) -> bool ExperimentRunner.run(tasks) -> ExperimentSummary StructuredExperimentRunner.run(tasks) -> StructuredExperimentSummary MultiAgentPipeline.run(tasks) -> CollabExperimentSummary SharedStateManager.create/read/add_ref/release/reclaim_expired
必选:Planner + Retriever + Executor + Summarizer;可选: Verifier(质量检查角色,不代替信息检索或总结生成角色)。 Experiment Runner、Runtime、Capability Registry、Router 与共享 内存管理器均为基础设施,不算作 Agent。
用户复杂任务 → Planner(任务 DAG) ├→ Retriever(本地知识库检索,来源+相关性分数) └→ Executor(白名单工具:os_info/python_env/disk_usage/read_build_log/check_commands) ↓ 证据引用 / 状态句柄(内联 / Socket 字节 / CPU 共享内存) Summarizer(综合两个上游结果 → 最终报告) → 可选 Verifier → Experiment Runner(指标与协作审计)
ROLE_CAPABILITY_MISMATCH
multi_agent_collaboration_valid=false
python -m baseline.main --config configs/multi_agent.yaml --provider mock python -m baseline.main --config configs/multi_agent.yaml --groups A,D --no-verifier
正式复杂任务集:data/complex_tasks.jsonl(openEuler 软件包构建 失败诊断,需检索 data/knowledge_base/ 并诊断 data/build_logs/)。输出:每组 run_*_group<X>_{details.jsonl,summary.json,details.csv,collaboration.md} 与跨组 multi_agent_comparison_*.{json,md}(含每任务完整调用链 “用户任务 → Planner → Retriever/Executor → Summarizer → 最终结果”、 角色消息数、能力路由次数、检索/执行→总结字节与状态引用次数、 共享状态泄漏检查)。
data/complex_tasks.jsonl
data/knowledge_base/
data/build_logs/
run_*_group<X>_{details.jsonl,summary.json,details.csv,collaboration.md}
multi_agent_comparison_*.{json,md}
四 Agent 注册、能力路由(含错误角色拒绝、万能 Agent 拒绝)、多 步骤流水线(顺序与调用链)、角色绕过、虚假参与、Summarizer 上游 缺失(UPSTREAM_RESULT_MISSING)、共享内存协作(创建/读取/释放/ 租约/引用计数/无泄漏、双上游 state_ref 路径)、三 Agent 最低要求 与角色类别最低要求、四实验组拓扑一致性。
UPSTREAM_RESULT_MISSING
两套环境共用协议与 Agent 契约,但性能数据严格隔离:
outputs/windows_bench_*
outputs/linux_ai_demo_*
Windows 不得使用 memfd / SCM_RIGHTS / POSIX shm_open。Linux AI 延迟不得画进 Windows IPC 柱状图。KPI 中的「KV Cache」显示为 未启用;共享内存压力来自真实 active/max 字节比。
memfd
SCM_RIGHTS
shm_open
active/max
# 1) 安装 .\scripts\windows\setup.ps1 # 2) 构建 Rust Runtime .\scripts\windows\build-runtime.ps1 # 3)(可选)启动 Rust Runtime;Benchmark 也可自动使用 Python Shim .\scripts\windows\start-runtime.ps1 # 4) IPC 微基准(禁止调用 AI API) .\scripts\windows\run-benchmark.ps1 # 5) Dashboard(API :8000;若无 dist 先 npm run build) .\scripts\windows\start-dashboard.ps1 # 浏览器打开 http://127.0.0.1:8000 # 顶部「赛题标准指标」固定展示:消息次数 / Token / 字符开销 / # 非文本传递次数与字节 / 单任务时延 / 记忆命中率 / 整体性能提升 # 主看组 D vs 组 A;点击「运行赛题评测」 # 打包提交辅助材料: .\scripts\windows\package-contest.ps1 # 另开终端开发前端: cd dashboard\frontend; npm run dev
openEuler / Linux 看板与打包:
bash scripts/linux/start-dashboard.sh bash scripts/linux/package-contest.sh
结果路径:
outputs/windows_bench_<timestamp>_details.jsonl
outputs/windows_bench_<timestamp>_summary.json
outputs/windows_bench_<timestamp>_comparison.csv
outputs/windows_bench_<timestamp>_report.md
访问 Linux AI(可选联动,不传 API Key):
$env:LINUX_VM_API_BASE_URL = "http://<vm-ip>:8100" # 或写入 configs/windows_benchmark.yaml 的 linux_vm.api_base_url
# 1) 安装 bash scripts/linux/setup.sh # 2) 配置 API(只在 Linux 上) cp linux-ai-service/.env.example linux-ai-service/.env # 编辑: # LLM_API_KEY=... # LLM_BASE_URL=https://.../v1 # LLM_MODEL=... # 3) 启动服务(0.0.0.0:8100) bash scripts/linux/start-ai-service.sh # 4) 最小 API 探测 / 完整 Demo bash scripts/linux/test-api.sh bash scripts/linux/run-ai-demo.sh
结果路径:outputs/linux_ai_demo_<timestamp>.json无 Key 时返回 real_api_success=false / skipped=true,不会伪装成功。
outputs/linux_ai_demo_<timestamp>.json
real_api_success=false
skipped=true
rust-runtime/
src/baseline/platform/
src/baseline/experiment/windows_benchmark_runner.py
dashboard/
linux-ai-service/
configs/windows_benchmark.yaml
configs/linux_ai_demo.yaml
技术报告见 docs/技术报告.md, 系统设计见 docs/system_design.md, 实验报告见 docs/contest_experiment_report.md, 完整部署与验收见 docs/deploy_openeuler.md。
docs/技术报告.md
docs/system_design.md
docs/contest_experiment_report.md
docs/deploy_openeuler.md
# 四 Agent + 共享记忆 + embedding 非文本传递 python -m baseline.main --config configs/multi_agent.yaml --provider mock # 两组关联连续任务记忆实测(gcc_chain / openssl_chain) python -m baseline.main --config configs/multi_agent.yaml --mode continuous_memory --provider mock # ≥10 轮稳定性 bash scripts/linux/run-contest-stability.sh # 演示录屏辅助 bash scripts/linux/record-demo.sh
非文本状态说明:docs/non_text_state_transfer.md。
docs/non_text_state_transfer.md
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
多 Agent 通信实验:四 Agent 协作 + 纯文本基线 + JSON 结构化控制消息
本项目用于参加”第三届中国研究生操作系统开源创新大赛”。当前包含:
docs/;docs/role_specification.md、docs/task_flow.md、docs/experiment_contract.md。1. 阶段目标
产出四类指标:Token 数量、端到端延迟、Agent 间消息数、最终结果正确率, 作为阶段二(结构化协议)、阶段三(共享内存/非文本状态传递)的对照基线。
2. 系统执行流程
对每条测试任务:
data/benchmark_tasks.jsonl读取任务(JSONL 仅是本地测试数据格式,不属于 Agent 间通信协议);3. 为什么当前阶段只使用纯文本
纯文本自然语言是多 Agent 系统最朴素的通信方式,也是本赛题所有优化 (结构化协议、非文本状态传递、共享记忆)要对比的基准。先把对照组 做稳、做可复现,后续每一项优化的收益才有可信的参照系。
4. Agent 职责
AgentA.process(task) -> strAgentB.handle(message) -> strAgent 不做实验指标汇总;统计统一由
ExperimentRunner和MetricsRecorder完成。5. 统计口径
Token
按六个维度记录:
agent_a_input_tokens、agent_a_output_tokens、agent_b_input_tokens、agent_b_output_tokens、message_tokens(Agent 间 消息单独统计,供阶段二对比)、total_model_tokens(四个模型端数值之和)。usage精确值(token_count_exact=true); API 未返回 usage 时使用本地估算器,并如实标记token_count_exact=false;message_tokens)始终使用同一估算器计算,保证两种模式下口径一致。延迟
使用
time.perf_counter_ns()高精度计时,单位毫秒:agent_a_latency_ms:Agent A 从开始处理任务到生成消息;message_transfer_latency_ms:TextChannel.send()到消息交给 Agent B 前;agent_b_latency_ms:Agent B 从收到消息到生成答案;end_to_end_latency_ms:任务开始到获得最终答案(不含数据加载和结果写盘)。近似满足:端到端 ≈ A + 传输 + B + 运行器开销。
消息数
第一版口径:只统计 Agent 之间实际经过
TextChannel.send()的消息。 Agent B 的最终结果直接交给实验运行器,不额外算一条消息,即每任务 1 条 (A→B)。如将配置communication.count_return_message设为true, B→A 的回程结果消息也会入账,每任务记 2 条。正确率
accuracy = 正确任务数 / 总任务数。支持四种评测方式:exact_match:输出与标准答案完全一致;normalized_exact_match:去首尾空格、转小写、合并连续空白、去常见结尾标点后比较;contains:标准化后答案包含标准答案;numeric_match:提取数字比较(取预测文本中最后一个数字,容差 1e-6)。6. 环境安装
要求 Python ≥ 3.11(在 openEuler 24.03-LTS-SP3 自带 Python 3.11 上验证目标)。
不想安装也可以用
PYTHONPATH=src python3 -m baseline.main ...运行。7. 配置
实验参数集中在
configs/baseline.yaml(provider、模型名、温度、超时、 重试次数、消息统计口径、数据集路径、输出目录、随机种子等),命令行参数 可覆盖其中的 provider、repeat 和数据集。8. Mock 模式运行(离线、确定性、CI 可用)
Mock 客户端对相同输入永远产生相同输出:Agent A 用固定模板转述任务, Agent B 用内置确定性规则引擎求解,无任何随机性,无网络依赖。
9. API 模式运行(OpenAI-compatible)
参考
.env.example。密钥只从环境变量读取,不写入代码和配置。调用失败 (网络错误、超时、HTTP 错误、空响应)会抛出明确错误并记录到该条任务的 结果里,不会静默切换成 Mock 模式。常用参数:
10. 测试
覆盖 TextChannel(类型约束、计数、内容不变、元数据)、Evaluator(四种 评测方式)、指标统计(Token 累加、延迟、消息数、正确率、P50/P95)、 ExperimentRunner(单任务全流程、多任务、失败隔离、文件输出)以及 “Mock 模式下基准任务集 100% 通过”的回归保护。
阶段二新增测试:消息模型与序列化一致性、Schema 校验(缺字段/未知 类型/未知动作/版本不符/缺 correlation_id 等均被拒绝)、RequestTracker (登记/关联/重复响应/未知关联/超时)、CapabilityRegistry 与路由 (注册/查询/注销/确定性多 Agent 路由)、任务状态机(合法与非法转换/ 取消/超时)、StructuredChannel(字节统计/校验先于执行/消息去重)、 文本回退(许可控制/原因记录/JSON 不进 LLM)、结构化集成与两种模式 对照实验(含对照报告生成)。
11. 输出文件
每轮运行在
outputs/生成三个文件:run_<时间戳>_<轮次>_details.jsonl:任务级明细(问题、A 的消息、B 的答案、 正误、六维 Token、四段延迟、消息数、错误信息);run_<时间戳>_<轮次>_summary.json:实验汇总(正确率、失败率、消息总数、 Token 总量与均值、平均/P50/P95 延迟等);run_<时间戳>_<轮次>_details.csv:与明细同构,便于绘图与统计。12. 当前阶段的限制
TextChannel为进程内传递,传输延迟接近 0(仍如实记录);13. 阶段二:JSON 结构化控制消息(structured_json)
13.1 运行
通信模式也可用环境变量覆盖:
BASELINE_COMMUNICATION_MODE=structured_json。13.2 消息流程
parameters.task_text业务文本 交给模型(指标llm_visible_tokens/control_plane_bytes佐证);13.3 新增输出
结构化模式除三个常规文件外多一个消息级明细
run_<时间戳>_<轮次>_structured_json_messages.jsonl; compare 模式额外生成outputs/comparison_<时间戳>.{json,csv,md}对照报告(Token 收益、字节开销、Schema/路由开销、质量变化, 全部来自实际实验数据)。13.4 协议文档
docs/protocol_spec.mddocs/field_dictionary.mddocs/error_codes.mddocs/routing_rules.mddocs/fallback_strategy.md14. 与阶段三的衔接
协议语义(
baseline/protocol/)、编码(JSON)与传输 (baseline/communication/)严格解耦。UnixSocketTransport已实现 (socket.socketpair(),Linux 上即 AF_UNIX;4 字节长度前缀 + JSON 帧),供 C/D 实验组使用;后续把 StructuredRuntime 的状态机/路由/ 关联逻辑迁往独立 Rust Runtime 进程时,业务 Agent、评测与指标模块 不修改(见docs/rust_runtime_architecture.md)。以下接口保持稳定:
15. 正式四 Agent 系统(multi_agent 模式)
15.1 拓扑与流程
ROLE_CAPABILITY_MISMATCH);multi_agent_collaboration_valid=false)。15.2 实验组(相同拓扑对照)
15.3 运行
正式复杂任务集:
data/complex_tasks.jsonl(openEuler 软件包构建 失败诊断,需检索data/knowledge_base/并诊断data/build_logs/)。输出:每组run_*_group<X>_{details.jsonl,summary.json,details.csv,collaboration.md}与跨组multi_agent_comparison_*.{json,md}(含每任务完整调用链 “用户任务 → Planner → Retriever/Executor → Summarizer → 最终结果”、 角色消息数、能力路由次数、检索/执行→总结字节与状态引用次数、 共享状态泄漏检查)。15.4 新增测试
四 Agent 注册、能力路由(含错误角色拒绝、万能 Agent 拒绝)、多 步骤流水线(顺序与调用链)、角色绕过、虚假参与、Summarizer 上游 缺失(
UPSTREAM_RESULT_MISSING)、共享内存协作(创建/读取/释放/ 租约/引用计数/无泄漏、双上游 state_ref 路径)、三 Agent 最低要求 与角色类别最低要求、四实验组拓扑一致性。16. 跨环境:Windows 通信性能测试 + Linux AI 流程验证
两套环境共用协议与 Agent 契约,但性能数据严格隔离:
outputs/windows_bench_*outputs/linux_ai_demo_*Windows 不得使用
memfd/SCM_RIGHTS/ POSIXshm_open。Linux AI 延迟不得画进 Windows IPC 柱状图。
KPI 中的「KV Cache」显示为 未启用;共享内存压力来自真实
active/max字节比。16.1 Windows 安装与运行
openEuler / Linux 看板与打包:
结果路径:
outputs/windows_bench_<timestamp>_details.jsonloutputs/windows_bench_<timestamp>_summary.jsonoutputs/windows_bench_<timestamp>_comparison.csvoutputs/windows_bench_<timestamp>_report.md访问 Linux AI(可选联动,不传 API Key):
16.2 Linux 虚拟机安装与运行
结果路径:
outputs/linux_ai_demo_<timestamp>.json无 Key 时返回
real_api_success=false/skipped=true,不会伪装成功。16.3 目录要点
rust-runtime/:Windows Named Pipe + CreateFileMappingWsrc/baseline/platform/:Python Windows Backend + framingsrc/baseline/experiment/windows_benchmark_runner.py:IPC 微基准dashboard/:FastAPI + React/Vite 实时可视化linux-ai-service/:Linux AI Demo FastAPIconfigs/windows_benchmark.yaml/configs/linux_ai_demo.yaml16.4 openEuler 赛题主路径(共享记忆 + 非文本状态 + 连续任务)
技术报告见
docs/技术报告.md, 系统设计见docs/system_design.md, 实验报告见docs/contest_experiment_report.md, 完整部署与验收见docs/deploy_openeuler.md。非文本状态说明:
docs/non_text_state_transfer.md。