# 《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; // 执行
}
1
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

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(&section.heading).bold().size(32))
        );
        for para in &section.paragraphs {
            doc = doc.add_paragraph(Paragraph::new().add_run(Run::new().add_text(para)));
        }
    }
    doc.build().pack(output_path)?;
    Ok(())
}
1
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 渲染的好处是:同一个进程内完成,零网络开销,没有外部依赖。