AI Agent BAC 是一个基于 Spring AI 和 Vue 3 构建的智能体应用平台,包含 AI 中医大师 和 AI 超级智能体 两大核心功能模块。项目采用前后端分离架构,后端基于 Spring Boot 3.5.5 + Spring AI 框架,前端基于 Vue 3 + Vite 构建,提供完整的 AI 聊天机器人解决方案。
本项目集成了先进的 RAG(检索增强生成)技术,支持向量数据库存储与检索,接入通义千问大语言模型,同时兼容本地 Ollama 模型部署。项目还实现了 MCP(Model Context Protocol)协议支持,可灵活扩展多种工具调用能力。
平台特色在于将传统中医知识与现代 AI 技术深度融合,通过向量检索技术实现中医经典文献的智能问答,为用户提供专业的中医养生指导服务。
AI 中医大师模块提供专业的中医养生咨询服务,基于预置的中医经典文献库,包括中医基础知识、体质辨识、经典方剂、常见问题解答等内容。该模块采用 RAG 技术,能够根据用户问题检索相关中医知识,生成专业、准确的中医养生建议。系统内置九种体质辨识算法,可根据用户描述的症状、生活习惯、形体特征等进行个性化体质判定,并提供针对性的调理方案。中医大师以和蔼可亲的专家形象出现,言语温和亲切,既具专业严谨性,又有长者关怀之情。
AI 超级智能体模块是一个功能强大的通用 AI 助手,具备多种工具和功能扩展能力。该模块基于 ReAct(Reasoning and Acting)智能体架构,能够自主推理、决策并调用各类工具完成任务。系统集成了 MCP 协议支持,可动态加载和管理外部工具插件,实现与第三方系统的无缝对接。超级智能体支持流式响应输出,通过 SSE(Server-Sent Events)技术实现实时对话效果,为用户提供流畅的交互体验。
项目具备多项先进技术特性。在对话能力方面,支持同步和异步两种调用模式,流式响应基于 SSE 技术实现实时输出,聊天历史通过文件存储机制实现持久化保存。在检索增强方面,采用 PgVector 向量数据库存储文档向量,使用 HNSW 索引算法优化检索性能,支持批量文档处理,单次最多可处理 10000 篇文档。在模型支持方面,默认使用通义千问 qwen-plus 模型,同时兼容本地 Ollama 部署的 gemma3:1b 模型,灵活适应不同部署场景需求。
后端基于 Spring Boot 3.5.5 构建,使用 Java 21 开发,主要依赖包括 Spring AI 框架、Spring WebFlux 响应式编程支持、PostgreSQL 数据库及 PgVector 向量扩展。项目采用模块化设计,主要包含以下几个核心包结构:com.mashang.bac.web.advisor 包提供增强型顾问组件,包括禁止词过滤等功能;com.mashang.bac.web.agent 包实现智能体核心逻辑,包含 BaseAgent、ReActAgent、ToolCallAgent 等实现;com.mashang.bac.web.app 包封装具体应用服务,如 Manus、TcmApp 等;com.mashang.bac.web.config 包提供配置类定义;com.mashang.bac.web.controller 包实现 REST 接口;com.mashang.bac.web.service 包包含业务逻辑实现。
前端技术栈采用 Vue 3.3.4 框架,配合 Vue Router 4.2.4 实现路由管理,状态管理使用 Pinia 2.1.6,网络请求基于 Axios 1.5.0,Markdown 渲染使用 Marked 16.2.1,构建工具为 Vite 4.4.9。项目目录结构清晰,src/api 存放接口配置,src/components 存放公共组件(如 MarkdownRenderer),src/router 存放路由定义,src/stores 存放状态管理,src/views 存放页面视图。
系统采用分层架构设计,从上到下依次为 Controller 层负责接口入口、Service 层处理业务逻辑、Agent 层实现智能体决策、Invoke 层封装模型调用。数据流采用 RAG 流程:用户输入首先经过禁止词过滤,然后由 Agent 分析意图,决定是直接回答还是检索知识库;若需检索,则调用向量数据库进行相似度搜索,将检索结果与用户问题一起发送给大语言模型生成最终回答。响应式设计采用 SSE 技术实现流式输出,提升用户体验。
ai-agent-bac/
├── ai-agent-font/ # 前端项目目录
│ ├── src/
│ │ ├── api/ # API接口配置
│ │ │ └── chat.js # 聊天API封装
│ │ ├── components/ # 公共组件
│ │ │ └── MarkdownRenderer.vue # Markdown渲染组件
│ │ ├── router/ # 路由配置
│ │ │ └── index.js # 路由定义
│ │ ├── stores/ # 状态管理
│ │ │ └── chat.js # 聊天状态管理
│ │ ├── views/ # 页面视图
│ │ │ ├── Home.vue # 主页(应用选择)
│ │ │ ├── ManusApp.vue # AI超级智能体页面
│ │ │ └── TcmApp.vue # AI中医大师页面
│ │ ├── App.vue # 根组件
│ │ ├── main.js # 应用入口
│ │ └── style.css # 全局样式
│ ├── index.html # HTML模板
│ ├── package.json # 项目依赖配置
│ ├── vite.config.js # Vite构建配置
│ └── README.md # 前端项目说明
│
├── bac/ # 后端项目目录
│ ├── src/main/
│ │ ├── java/com/mashang/bac/
│ │ │ ├── BacApplication.java # 启动类
│ │ │ └── web/
│ │ │ ├── advisor/ # 顾问组件
│ │ │ │ ├── MyAdvisor.java
│ │ │ │ └── ProhibitedWordAdvisor.java
│ │ │ ├── agent/ # 智能体实现
│ │ │ │ ├── BaseAgent.java
│ │ │ │ ├── ReActAgent.java
│ │ │ │ └── ToolCallAgent.java
│ │ │ ├── app/ # 应用服务
│ │ │ │ ├── Manus.java
│ │ │ │ └── TcmApp.java
│ │ │ ├── chatmemory/ # 聊天记忆管理
│ │ │ │ ├── FileBasedChatMemory.java
│ │ │ │ └── InMemoryChatMemory.java
│ │ │ ├── config/ # 配置类
│ │ │ │ ├── ChatClientConfig.java
│ │ │ │ ├── CorsConfig.java
│ │ │ │ └── JsonConfig.java
│ │ │ ├── controller/ # 控制器
│ │ │ │ └── AiController.java
│ │ │ ├── dto/ # 数据传输对象
│ │ │ │ └── DashScopeImageResponse.java
│ │ │ ├── exception/ # 异常处理
│ │ │ │ ├── BusinessException.java
│ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ └── ThrowUtils.java
│ │ │ ├── invoke/ # AI模型调用
│ │ │ │ ├── LangChainAiInvoke.java
│ │ │ │ ├── OllamaAiInvoke.java
│ │ │ │ └── SpringAiAiInvoke.java
│ │ │ ├── rag/ # RAG相关
│ │ │ │ ├── MyKeywordEnricher.java
│ │ │ │ ├── MyTokenTextSplitter.java
│ │ │ │ └── TcmAppDocumentLoader.java
│ │ │ ├── service/ # 业务服务
│ │ │ │ ├── BasicChatService.java
│ │ │ │ ├── DocumentSearchService.java
│ │ │ │ ├── QueryTransformService.java
│ │ │ │ └── RagChatService.java
│ │ │ └── utils/ # 工具类
│ │ │ ├── QwenImage.java
│ │ │ ├── ResultTUtil.java
│ │ │ ├── RowsTUtil.java
│ │ │ └── ToolRegistration.java
│ │ └── resources/
│ │ ├── document/ # 知识库文档
│ │ │ ├── 中医体质辨识.md
│ │ │ ├── 中医基础知识.md
│ │ │ ├── 中医常见问题解答.md
│ │ │ └── 中医经典方剂.md
│ │ ├── prohibited/ # 禁止词库
│ │ │ └── prohibited-words.txt
│ │ ├── prompts/ # 提示词模板
│ │ │ └── system-message.st
│ │ ├── application.yml # 应用配置
│ │ └── mcp-servers.json # MCP服务器配置
│ ├── image-search-mcp/ # MCP图像搜索模块
│ ├── pom.xml # Maven配置
│ └── ...
│
└── README.md # 项目说明文档
后端项目需要以下运行环境支持:Java 21 或更高版本,Maven 3.6+ 构建工具,PostgreSQL 15+ 数据库且已安装 PgVector 扩展插件。数据库需要预先创建并配置好连接信息,包括数据库名称、用户名和密码。向量数据库插件 PgVector 的安装可参考其官方文档进行配置。若需要使用本地模型,还需安装 Ollama 服务并启动 gemma3:1b 模型。
前端项目需要 Node.js 16+ 版本和 npm 7+ 包管理器。建议使用 pnpm 作为包管理器以获得更好的依赖管理体验。开发环境推荐使用 VS Code 或 IntelliJ IDEA 作为代码编辑器,并安装 Vue 3 语法支持插件。
首先克隆项目代码到本地:
git clone https://github.com/014-code/ai-agent-bac.git
cd ai-agent-bac进入后端目录并构建项目:
cd bac确保已正确配置 src/main/resources/application.yml 中的数据库连接信息和其他配置项。主要配置项包括:spring.datasource.url(数据库连接地址)、spring.datasource.username(数据库用户名)、spring.datasource.password(数据库密码)、spring.ai.dashscope.api-key(通义千问 API Key)、app.chat-memory.dir(聊天记忆存储目录)等。
配置完成后,执行 Maven 构建命令:
./mvnw clean package -DskipTests或者在 Windows 环境下:
mvnw.cmd clean package -DskipTests构建成功后,运行应用程序:
java -jar target/bac-0.0.1-SNAPSHOT.jar后端服务启动后,默认监听 8101 端口,API 根路径为 /api。可通过访问 http://localhost:8101/api/swagger-ui.html 查看 API 文档(已集成 Knife4j Swagger UI)。
进入前端项目目录:
cd ai-agent-font安装项目依赖:
npm install或者使用 pnpm:
pnpm install启动开发服务器:
npm run dev开发服务器启动后,默认在 http://localhost:5173 端口运行。打开浏览器访问该地址即可使用系统。
构建生产版本:
npm run build构建产物将生成在 dist 目录下,可部署到 Nginx 或其他 Web 服务器。
后端配置文件位于 bac/src/main/resources/application.yml,主要配置项说明如下:
数据库配置部分需配置 PostgreSQL 数据库连接信息,包括数据库地址、用户名和密码。系统使用 PgVector 向量数据库存储文档向量,支持 HNSW 索引类型,维度设置为 1536,距离类型为余弦相似度。
AI 模型配置部分需配置通义千问 API Key,模型名称默认为 qwen-plus。若使用本地 Ollama 模型,需配置 base-url(默认 http://localhost:11434)和模型名称(默认 gemma3:1b)。
MCP 配置部分定义外部工具服务器的连接方式,支持 stdio 和 SSE 两种模式。默认使用 stdio 模式连接本地 MCP 服务器,配置文件位于 mcp-servers.json。
应用配置部分包括服务器端口(默认 8101)、Servlet 上下文路径(默认 /api)、聊天记忆存储目录等参数。
前端项目主要配置位于 src/api/chat.js 文件中,包含 API 请求的基础地址和接口路径。Vite 构建配置位于项目根目录的 vite.config.js 文件中,可根据需要调整开发服务器端口、代理配置等参数。
系统提供以下核心接口用于 AI 对话功能:
同步聊天接口:GET /api/ai/tcm_app/chat/sync,参数包括 message(用户消息)和 chatId(会话 ID),返回字符串类型的完整回答。
SSE 流式聊天接口:GET /api/ai/tcm_app/chat/sse,参数包括 message 和 chatId,返回 ServerSentEvent 格式的流式响应,支持实时推送回答内容。
SSE 文本流接口:GET /api/ai/tcm_app/chat/sset,参数包括 message 和 chatId,返回纯文本流格式的响应。
详细 API 文档可在启动后访问 http://localhost:8101/api/swagger-ui.html 查看。
系统内置中医知识库,包含以下文档文件,位于 bac/src/main/resources/document/ 目录:
中医体质辨识.md 文档详细介绍了九种体质的分类标准、特征描述和辨识方法,每种体质包含形体特征、心理特征、常见表现、发病倾向等维度的说明,并提供针对性的养生调理建议。
中医基础知识.md 文档涵盖阴阳学说、五行学说、脏腑学说等核心理论,是中医理论体系的基础内容,可用于回答用户关于中医基础概念的咨询。
中医常见问题解答.md 文档整理了常见的中医问题和专业解答,涵盖养生保健、疾病防治、饮食调理等方面的话题。
中医经典方剂.md 文档收录了经典中药方剂的组成、功效、主治和用法等信息,可用于推荐调理方案时参考。
知识库文档支持动态更新,修改文档内容后系统会自动重新加载向量索引。
若启动时出现数据库连接错误,请检查 application.yml 中的数据库连接信息是否正确,包括数据库地址、端口、用户名和密码。确保 PostgreSQL 服务已启动,且已正确安装 PgVector 扩展插件。可使用以下 SQL 命令检查 PgVector 是否已安装:
SELECT * FROM pg_extension WHERE extname = 'vector';若返回空结果,需先安装 PgVector 插件。
若知识库检索功能返回空结果,可能是向量索引未正确构建。请检查文档目录 document/ 下是否存在 Markdown 文件,以及文件编码是否为 UTF-8。确保向量数据库中有对应的向量数据,可通过数据库查询工具检查 vector_store 表中的数据记录。
若前端页面出现请求超时提示,请检查后端服务是否正常运行,以及 API 地址配置是否正确。开发环境下可使用浏览器开发者工具查看网络请求详情,确认请求URL和响应状态码。
SSE 流式连接可能因网络问题或服务端超时而断开。前端已实现自动重连机制,若需手动调整超时时间,可在 application.yml 中配置 ServerSentEvent 超时参数。
本项目基于 MIT 许可证开源,您可以自由使用、修改和分发本项目的代码,但需保留原始版权声明。
欢迎为本项目贡献代码或提出改进建议。您可以通过以下方式参与:提交 Bug 报告或功能建议、 Fork 本项目并提交 Pull Request、完善文档或翻译、分享使用经验。若您有任何问题或建议,请在项目 Issue 页面留言。