跳转至

企业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 映射宿主机端口。
  • 敏感文件拦截.envdocker-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 路由端点。


效果

问题类型 示例 返回
考勤 "本月考勤"、"上月考勤" 秒回真实数据
制度 "印章制度"、"合同审批" 秒回,还标出处
财务 "报销流程" 秒回,给出详细流程

智能体对话截图

AI助手对话示例

价值:从"找人"到"问它"——省人力(自助)、(秒级回答、7×24)、(双数据源统一口径)。


参考

  • deepseek
  • https://github.com/langchain-ai/langchain
  • https://github.com/fastapi/fastapi
  • https://cn.vuejs.org/
回到页面顶部