企业AI助手:用 RAG + LangGraph 打造智能体
2026-08-21 by dongnan
前置说明
先解释两个关键词:
- RAG(检索增强生成)——先从知识库检索、再生成,让答案有据可查,而不是大模型"瞎编"。
- LangGraph——构建 AI Agent(智能体)的框架,让模型能"思考→行动"循环,自主判断该查数据还是查文档。
企业AI助手(xaia26)是一个面向企业内部员工的 AI 智能体,为公司内部提供考勤查询、请假查询和制度问答服务。
它解决一个非常具体的痛点:员工想查考勤、查制度、问报销流程,以前都得"找人",现在问 AI 就行。
此外,这是第二个通过 vibecoding 方式完成的 AI 项目;首个 AI 项目:指数估值分析AI工具
痛点与目标
企业内部信息散落在"人、文件、系统"三处,想问清楚,都得"找人"。
| 场景 | 以前怎么做 | 麻烦在哪 |
|---|---|---|
| 财务制度 | 翻文件、问财务 | 制度多、细则多,财务重复回答 |
| 员工手册 | 问 HR、等回复 | 请假、报销高频问题,HR 被重复问 |
| 考勤·打卡 | 记不清打卡时间,找 IT 导数据 | 门禁和微信两套数据,人工核对累 |
目标:是让员工像问同事一样问"智能体",它能够秒回答案、数据真实且权威,不因幻觉而乱造。
系统架构
七个服务,一张图看懂:
用户 ──→ xaia-nginx(网关) ──→ xaia-ui(Vue3) ──→ xaia-api(FastAPI) ──→ xaia-agent(ReAct)
│ ▲
│ └─ SSE 流式输出
▼
MySQL · Redis · Chroma(嵌入式) · DeepSeek
门禁 · 企业微信 ──→ xaia-data ──→ SQLite 暂存 ──→ 推送 ──→ xaia-api ──→ MySQL
请求从网关进入,经过 UI 到业务后台,再由 Agent 决策;数据从门禁和企业微信侧通过数据接入服务采集、暂存、容错推送进 MySQL。
技术选型
| 层 | 组件 | 说明 |
|---|---|---|
| 大模型 | DeepSeek | 生成答案 |
| Embedding | text-embedding-v4 | 文档/问题向量化 |
| AI 框架 | LangChain + LangGraph | ReAct Agent 编排、RAG 链路 |
| 向量库 | Chroma(嵌入式) | 知识库的向量检索 |
| 关系库 | MySQL | 业务数据(考勤、员工、请假) |
| 缓存 | Redis | 会话上下文、限流 |
| 后端 | FastAPI | 认证、考勤/请假查询、员工管理 |
| Agent | FastAPI · LangGraph | ReAct Agent + RAG + 工具调用,SSE 流式 |
| 前端 | Vue | 聊天、查询、管理后台 |
| 网关 | nginx | 路由 + auth_request 认证 + SSE 代理 |
| 包管理 | uv · pnpm | Python / Node 依赖管理 |
选型原则:够用、可维护。
- Chroma 是嵌入式向量库,跑在 xaia-agent 进程里,不单独部署。
- 选 Chroma 而不是重量级的 Milvus,因为制度文档量级不大,部署简单、启动快,更适合企业内部小规模知识库。
核心实现
数据接入
打通门禁系统和企业微信,考勤、请假、员工数据自动采集进 MySQL。
门禁系统 ──┐
├──→ xaia-data ──→ SQLite 暂存 ──→ 推送 ──→ xaia-api ──→ MySQL
企业微信 ──┘
容错是关键:先落 SQLite 本地暂存,再推送到 xaia-api,网络断了自动补传,不丢数据。这等价于一个带补偿机制的同步任务——失败不丢弃,恢复后重放,保证最终一致。
RAG 知识库
把《员工手册》《财务管理制度》等文件,转成 AI 能检索的知识。
入库流程:
文档 → 切分(chunk) → embedding 向量化 → 存入 Chroma
问答流程:
问题 → embedding → Chroma 检索 top-k → 拼入 prompt → DeepSeek 生成 → 标注出处
整条链路由 LangChain 串联:文档切分、向量检索、prompt 组装都是现成组件,省去手写胶水代码。
关键点:回答都标出处。每个答案对应检索到的文档片段,可追溯——这是 RAG 相对"裸问大模型"的核心价值。
Agent 编排
接入大模型后,让 AI 三步走:
听懂问题(意图识别) → 查考勤数据 / 制度知识库(工具调用) → 组织成人话(生成回答)
- 问"本月考勤" → 识别为数据查询 → 调 xaia-api 取考勤数据 → 组织回答
- 问"报销流程" → 识别为制度查询 → 检索知识库 → 组织回答
- 支持上下文记忆,可连续追问
这本质是一个 LangGraph ReAct Agent:模型在"思考(Reason)→ 行动(Act)"的循环里,按需调用"查考勤""查制度"等工具,直到拿到足够信息再组织回答。真实数据和文档由外部工具提供,模型只做"编排者"。
回答通过 SSE 流式输出,边生成边显示,体验像打字机,而不是"转圈等全文"。
系统模块
七个服务各司其职:
| # | 服务 | 端口 | 职责 |
|---|---|---|---|
| 1 | xaia-nginx | 80/443 | 网关:路由 + auth_request 认证 + SSE 代理 |
| 2 | xaia-ui | 80(内部) | Vue 3 SPA,聊天 UI |
| 3 | xaia-api | 8001 | REST API:认证、考勤/请假查询、员工管理、对话管理 |
| 4 | xaia-agent | 8002 | ReAct Agent + RAG + 工具调用,SSE 流式 |
| 5 | xaia-data | 8003 | 门禁 + 企微采集,SQLite 暂存,容错推送 |
| 6 | MySQL | 3306 | 业务数据 |
| 7 | Redis | 6379 | 会话、限流 |
- 前端 xaia-ui 用 Vue 3 + Vite + Tailwind 组件化开发:聊天窗、考勤/请假查询、管理后台是独立组件,复用和扩展都方便;
- 后端 xaia-api 用 FastAPI,异步接口 + 自动生成 OpenAPI 文档,调试省心。
安全设计
从外到内层层设防:
防爬虫 → 短信验证码登录 → 数据隔离 → 审计留痕
工程侧还做了几件事:
- 容器加固:所有容器
cap_drop: ALL+no-new-privileges,无状态服务read_only,仅 nginx 映射宿主机端口。 - 敏感文件拦截:
.env、docker-compose.yml等请求直接返回 444。 - 安全响应头:X-Frame-Options、CSP、HSTS。
- 可追溯:日志经 syslog → log-router 集中落盘
/var/log/xaia/,留存 180 天。 - 扫描兜底:另有独立 AI 项目 sescan 定期做安全扫描。
工程实践:vibecoding
这个项目的开发方式和传统方式不同,以 AI 编程工具为"主程",人类提出需求、决策、验收,AI 工具负责实现代码:
- Spec 先行:先定义清楚"做什么",再把需求喂给 AI。
- 模块化拆分:七个服务职责单一,AI 生成、人审边界。
- 快速迭代:需求 → 生成 → 测试 → 反馈,多轮循环。
让 AI 保持聚焦
AI 编程助手最大的敌人是"上下文爆炸"——七个服务塞进一个仓库,让 AI 一次看全部代码,注意力必然涣散。
所以采用分层规则文件 + 目录隔离启动:
- 根目录
AGENTS.md只放跨模块通用规则(命名、Git、测试策略); - 每个模块再放一份
AGENTS.md,只写模块专属规则(技术栈、接口、业务逻辑); - 日常开发从子模块目录启动,AI 只加载当前模块 + 根目录的规则,上下文保持聚焦;
- 只有跨模块修改(改 compose、共享 schema)才从根目录启动。
一句话:让 AI 每次只看到它该看的东西。
单仓库还是多仓库
七个服务耦合度高(data → api → agent → ui),选 monorepo 而不是拆成独立仓库:
| 独立仓库 | monorepo | |
|---|---|---|
| 改 API 契约 | 改两个 repo | 一个 commit 改两端 |
| Pydantic schema | 两边各写一份,易漂移 | 共享 schema,一处改 |
| 联调 | 每 repo 一份 compose | 一份编排,一键启动 |
判断线:服务数量、团队规模、接口是否稳定。开发期接口频繁变动,monorepo 明显划算;等接口稳定、团队人数增加再考虑拆。
最终交付:175 个 Python 文件 + 47 个 TypeScript + 11 个 Vue 组件,74 个 HTTP 路由端点。
效果
| 问题类型 | 示例 | 返回 |
|---|---|---|
| 考勤 | "本月考勤"、"上月考勤" | 秒回真实数据 |
| 制度 | "印章制度"、"合同审批" | 秒回,还标出处 |
| 财务 | "报销流程" | 秒回,给出详细流程 |
智能体对话截图

价值:从"找人"到"问它"——省人力(自助)、快(秒级回答、7×24)、准(双数据源统一口径)。
参考
- deepseek
- https://github.com/langchain-ai/langchain
- https://github.com/fastapi/fastapi
- https://cn.vuejs.org/