# 《WaLiOffice - AI Agent 智能办公平台》第1-2节:技术栈选型与系统架构设计
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!😄
大家好,我是技术UP主小傅哥。
上一节我们做了 WaLiOffice 的需求分析,知道了这个项目要做什么——对话即生产,用户说一句话,AI Agent 自动帮你生成 PPT、Word、Excel、图表、流程图、图片、视频等办公产物。但"做什么"解决了,接下来就是"怎么做"。但不少伙伴在面试准备中,总是需要,为什么是这个架构,为什么是这个技术栈等。所以这一节我们先来总结下。
你可以理解为:需求分析是画图纸,技术栈选型是选建材,架构设计是搭钢筋骨架。这一节我们会把 WaLiOffice 的"骨骼"全部展示出来,后面第 2 部分开始就是往骨架上"填肉"了。
# 一、设计思路:办公智能体
WaLiOffice 不是一个简单的"调 LLM API 返回文本"的聊天机器人,而是一个类似豆包、元宝一样有轻量功能的办公智能体(Office Agent)。
👩🏻🏫敲黑板:这里的"工具"和业务项目里的 RPC 协议很像——不同的服务之间通过 RPC 协议通信;在 WaLiOffice 里,Agent 通过 Tool 协议调用各类组件。RPC 定义了请求/响应格式,Tool 也定义了
name/description/parameters/call的标准接口。不同的组件产品实现各不相同,但对接到 Agent 的方式是大同小异的。各类智能体就业务项目里 RPC 协议一样,之后有不同类型的具体框架产品实现,但基本也都大同小异。
Agent 大脑(ReAct 循环)负责理解意图、拆解任务、决策调用哪个工具;工具手脚负责执行具体的生成逻辑。二者通过统一的 OfficeTool trait 接口对接:
#[async_trait]
pub trait OfficeTool: Send + Sync {
fn name(&self) -> &str; // 工具名(LLM 用来识别)
fn description(&self) -> &str; // 工具描述(LLM 用来理解能力)
fn parameters(&self) -> serde_json::Value; // 参数 schema(LLM 用来生成入参)
async fn call(&self, input: Value, ctx: &ToolContext) -> ToolResult; // 执行
}
2
3
4
5
6
7
每个工具只需要实现这四个方法,就能被 Agent 识别和调用。新增一种产物类型,只需要新增一个工具实现——扩展性就在这里。
WaLiOffice 的 10 个工具按照能力维度分为三层:
| 能力层 | 工具 | 底层组件 | 说明 |
|---|---|---|---|
| 文档渲染层 | doc_generate | docx-rs (opens new window) | 纯 Rust 生成 Word 文档 |
sheet_generate | rust_xlsxwriter (opens new window)(同类方案 EasyExcel (opens new window)) | 纯 Rust 生成 Excel 表格 | |
ppt_plan + ppt_generate | HTML/CSS(参考 PptxGenJS (opens new window) 思路) | 两步协作:先规划大纲再生成幻灯片 | |
md_generate | 内置 Markdown 模板 | 生成 Markdown 文件 | |
chart_generate | ECharts (opens new window) | 前端 ECharts 渲染,6 种图表类型 | |
drawio_generate | draw.io (opens new window) | 生成 draw.io XML,前端嵌入式编辑器 | |
| 多模态 AI 层 | image_prompt | Agnes AI Image API | 文生图 + 图生图 |
video_generate | Agnes AI Video API + ffmpeg | 远程视频生成 + 本地 ffmpeg 兜底 | |
| 信息增强层 | web_search | 百度 MCP / SearXNG / DuckDuckGo | 联网搜索,为 Agent 补充实时信息 |
这些工具对接很重要,之前我们做 ai agent 脚手架的时候,有一套 draw.io 对接,后来还扩展了 ppt。现在小傅哥把整个东西给大家,也是希望大家打开思路,所有你看到的豆包、元宝等市面的产品,你都是可以复刻出来的。这些框架的东西,本身就已经开源很多年了,现在是在 AI 下做对接。除了以上工具之外,打开思路,你还可以做其他工具的扩展。
# 二、组件对接详解
接下来,我们逐个说下 WaLiOffice 对接的各个组件的方式。(这些对接都是各类语言的,可以让 AI 辅助)
# 1. Word 文档 — docx-rs
- GitHub:https://github.com/dolanmiu/docx (opens new window)
- 在 WaLiOffice 中的角色:
doc_generate工具的底层渲染引擎
docx-rs 是一个纯 Rust 实现的 Word 文档生成库,支持标题、段落、列表、表格、加粗/斜体/字号等富文本格式。LLM 输出 JSON → Rust 结构体 → docx-rs 渲染 → DOCX 文件:
use docx_rs::*;
pub fn render_docx(data: &DocData, output_path: &Path) -> Result<()> {
let mut doc = Docx::new();
doc = doc.add_paragraph(
Paragraph::new().add_run(Run::new().add_text(&data.title).bold().size(56))
);
for section in &data.sections {
doc = doc.add_paragraph(
Paragraph::new().add_run(Run::new().add_text(§ion.heading).bold().size(32))
);
for para in §ion.paragraphs {
doc = doc.add_paragraph(Paragraph::new().add_run(Run::new().add_text(para)));
}
}
doc.build().pack(output_path)?;
Ok(())
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 设计点 | 决策 | 理由 |
|---|---|---|
| 语言 | 纯 Rust | 不依赖外部服务/命令行,安全且快速 |
| 格式 | DOCX(OOXML) | Word 原生格式,用户可直接打开 |
| 数据流 | LLM → JSON → 结构体 → docx-rs | 各环节职责清晰,便于调试 |
👩🏻🏫敲黑板:为什么不用 Java 的 EasyExcel 或 Python 的 python-docx?因为 WaLiOffice 是纯 Rust 后端。如果用 Java/Python 渲染,就需要额外起一个服务或者通过命令行调用——多了一个外部依赖,多了一个故障点。纯 Rust 渲染的好处是:同一个进程内完成,零网络开销,没有外部依赖。

