Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 1m17s
docs(quickstart): 更新快速开始文档以支持Nginx反向代理配置 - 修改环境变量配置方式,从直接创建.env文件改为复制模板文件 - 添加必需和可选配置项的详细说明 - 更新Docker Compose启动命令以使用正确的路径 - 增加Nginx反向代理访问方式的说明 - 为本地开发模式添加额外的数据库配置说明 fix(readme): 修正部署说明中的环境变量配置方法 - 将硬编码的环境变量配置改为使用模板文件复制方式 - 更新Docker Compose启动命令路径 - 补充Nginx反向代理访问说明 - 修正数据库配置注意事项 feat(backend): 支持从环境变量读取数据库连接配置 - 添加os模块导入 - 修改DB_URI配置逻辑,优先从环境变量读取 - 适配Docker和本地开发环境的不同数据库连接地址 refactor(docker): 优化Docker Compose配置支持Nginx代理 - 限制后端端口仅本机访问 - 修改前端API URL为相对路径,通过Nginx代理访问 - 限制前端端口仅本机访问 refactor(frontend): 适配Nginx反向代理后端API调用 - 将硬编码的后端API地址改为相对路径 - 支持通过Nginx代理转发请求到后端服务 chore(scripts): 更新启动脚本中的访问地址提示信息 - 修改前端启动成功后的访问地址提示 - 添加Nginx代理访问方式的说明 ```
290 lines
7.6 KiB
Markdown
290 lines
7.6 KiB
Markdown
# AI Agent - 智能助手系统
|
||
|
||
一个基于 LangGraph + FastAPI 的智能对话助手,支持多模型切换、RAG 知识库检索、文件处理和网页抓取等功能。
|
||
|
||
---
|
||
|
||
## 🎯 核心功能
|
||
|
||
### 面向用户的功能
|
||
|
||
- 💬 **智能对话**:支持多轮对话,自动记忆上下文
|
||
- 🌤️ **天气查询**:实时获取各地天气信息
|
||
- 📄 **文档处理**:读取 TXT、PDF、Excel 等格式文件
|
||
- 🌐 **网页抓取**:提取网页正文内容
|
||
- 🔍 **知识库检索(RAG)**:基于向量数据库的智能问答
|
||
- 🔄 **多模型切换**:前端可选择不同大语言模型
|
||
|
||
### 技术特性
|
||
|
||
- ✅ **持久化记忆**:PostgreSQL 存储对话历史,重启不丢失
|
||
- ✅ **高可用架构**:模型自动降级,确保服务稳定
|
||
- ✅ **前后端分离**:FastAPI 后端 + Streamlit 前端
|
||
- ✅ **Docker 部署**:一键启动所有服务
|
||
|
||
---
|
||
|
||
## 🏗️ 技术架构
|
||
|
||
### 技术栈
|
||
|
||
| 层级 | 技术选型 | 说明 |
|
||
|------|---------|------|
|
||
| **LLM 服务** | 智谱 AI API / vLLM (Gemma-4) | 云端 API 或本地推理 |
|
||
| **Embedding** | 智谱 Embedding API | 向量嵌入(无需 PyTorch) |
|
||
| **Agent 框架** | LangGraph + LangChain | 工作流编排 |
|
||
| **向量数据库** | ChromaDB / pgvector | RAG 知识检索 |
|
||
| **后端框架** | FastAPI + Uvicorn | RESTful API + WebSocket |
|
||
| **前端框架** | Streamlit | 交互式 Web 界面 |
|
||
| **数据库** | PostgreSQL 16 | 对话记忆持久化 |
|
||
| **容器化** | Docker + Docker Compose | 服务编排 |
|
||
|
||
### 架构图
|
||
|
||
```
|
||
┌──────────────┐
|
||
│ 用户浏览器 │ Streamlit 前端 (8501)
|
||
└──────┬───────┘
|
||
│ HTTP/WebSocket
|
||
↓
|
||
┌──────────────────┐
|
||
│ FastAPI 后端 │ 端口 8001
|
||
│ ┌────────────┐ │
|
||
│ │ AIAgent │ │ 多模型管理
|
||
│ └─────┬──────┘ │
|
||
│ │ │
|
||
│ ┌─────▼──────┐ │
|
||
│ │LangGraph │ │ 工作流引擎
|
||
│ │ StateGraph │ │
|
||
│ └─────┬──────┘ │
|
||
│ │ │
|
||
│ ┌─────▼──────┐ │
|
||
│ │ Tools │ │ 工具集合
|
||
│ │ - Weather │ │
|
||
│ │ - File IO │ │
|
||
│ │ - Web Scrap│ │
|
||
│ │ - RAG │ │
|
||
│ └────────────┘ │
|
||
└────────┬─────────┘
|
||
│
|
||
┌────┴────┐
|
||
↓ ↓
|
||
┌────────┐ ┌──────────┐
|
||
│PostgreSQL│ │ChromaDB │
|
||
│(记忆存储)│ │(向量检索)│
|
||
└────────┘ └──────────┘
|
||
```
|
||
|
||
### 项目结构
|
||
|
||
```
|
||
Agent1/
|
||
├── agent.py # Agent 服务核心(多模型管理)
|
||
├── graph_builder.py # LangGraph 状态图构建器
|
||
├── tools.py # 工具函数定义(@tool 装饰器)
|
||
├── backend.py # FastAPI 后端应用
|
||
├── frontend.py # Streamlit 前端界面
|
||
├── rag_example.py # RAG 实现示例(无 PyTorch)
|
||
├── docker-compose.yml # Docker 服务编排
|
||
├── Dockerfile.backend # 后端镜像构建
|
||
├── Dockerfile.frontend # 前端镜像构建
|
||
├── requirement.txt # Python 依赖
|
||
├── .env # 环境变量配置
|
||
└── user_docs/ # 用户文档目录
|
||
├── a.txt
|
||
├── b.pdf
|
||
└── c.xlsx
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 快速开始
|
||
|
||
详细启动指南请查看 [QUICKSTART.md](QUICKSTART.md)
|
||
|
||
### 方式一:Docker Compose(推荐)
|
||
|
||
```
|
||
# 1. 配置环境变量
|
||
cp .env.example .env
|
||
# 编辑 .env 文件,填入真实的 API Key
|
||
|
||
# 2. 启动所有服务
|
||
docker compose -f docker/docker-compose.yml up -d --build
|
||
|
||
# 3. 访问应用
|
||
# 如果配置了 Nginx 反向代理:http://your-domain.com 或 http://your-server-ip
|
||
# 如果未配置 Nginx(直接访问):
|
||
# - 前端: http://localhost:8501
|
||
# - 后端 API: http://localhost:8001
|
||
```
|
||
|
||
### 方式二:本地开发模式
|
||
|
||
```
|
||
# 1. 启动 PostgreSQL
|
||
docker run -d --name postgres-langgraph \
|
||
-e POSTGRES_PASSWORD=mysecretpassword \
|
||
-e POSTGRES_DB=langgraph_db \
|
||
-p 5432:5432 postgres:16
|
||
|
||
# 2. 安装依赖
|
||
pip install -r requirement.txt
|
||
|
||
# 3. 启动后端
|
||
python backend.py
|
||
|
||
# 4. 启动前端(新终端)
|
||
streamlit run frontend.py
|
||
```
|
||
|
||
---
|
||
|
||
## 📖 使用指南
|
||
|
||
### 基础对话
|
||
|
||
直接在聊天框输入问题即可:
|
||
|
||
```
|
||
你好,请介绍一下自己
|
||
今天北京天气怎么样?
|
||
帮我总结一下 a.txt 的内容
|
||
```
|
||
|
||
### 工具调用示例
|
||
|
||
| 功能 | 示例提问 |
|
||
|------|---------|
|
||
| 🌤️ 天气查询 | "上海今天天气如何?" |
|
||
| 📄 读取文本 | "读取 a.txt 的内容" |
|
||
| 📑 解析 PDF | "总结 b.pdf 的主要内容" |
|
||
| 📊 Excel 数据 | "显示 c.xlsx 的数据" |
|
||
| 🌐 网页抓取 | "抓取 https://example.com 的内容" |
|
||
| 🔍 知识库检索 | "根据知识库回答:XXX" |
|
||
|
||
### 多模型切换
|
||
|
||
1. 在左侧边栏选择模型:
|
||
- **智谱 GLM-4**:在线服务,速度快
|
||
- **本地 Gemma-4**:本地部署,隐私性好
|
||
|
||
2. 可随时切换,甚至在同一会话中
|
||
|
||
3. 点击 "🔄 新会话" 清空当前对话
|
||
|
||
---
|
||
|
||
## 🔧 开发指南
|
||
|
||
### 添加新工具
|
||
|
||
在 `tools.py` 中添加新的 `@tool` 装饰函数:
|
||
|
||
```
|
||
@tool
|
||
def my_new_tool(param: str) -> str:
|
||
"""
|
||
工具描述(会显示给 LLM)
|
||
|
||
Args:
|
||
param: 参数说明
|
||
|
||
Returns:
|
||
返回值说明
|
||
"""
|
||
# 实现逻辑
|
||
return result
|
||
```
|
||
|
||
工具会自动注册到 `AVAILABLE_TOOLS` 列表中。
|
||
|
||
### 添加新模型
|
||
|
||
在 `agent.py` 的 `initialize()` 方法中添加模型配置:
|
||
|
||
```
|
||
model_configs = {
|
||
"zhipu": self._create_zhipu_llm,
|
||
"local": self._create_local_llm,
|
||
"new_model": self._create_new_model_llm, # 添加新模型
|
||
}
|
||
```
|
||
|
||
### Docker 部署
|
||
|
||
项目包含完整的 Docker 配置:
|
||
|
||
- **docker-compose.yml**:服务编排(PostgreSQL + Backend + Frontend)
|
||
- **Dockerfile.backend**:后端镜像构建
|
||
- **Dockerfile.frontend**:前端镜像构建
|
||
- **.gitea/workflows/deploy.yml**:CI/CD 自动化部署
|
||
|
||
详见 [QUICKSTART.md](QUICKSTART.md) 的 Docker 部署章节。
|
||
|
||
---
|
||
|
||
## ⚙️ 环境配置
|
||
|
||
### 必需的环境变量
|
||
|
||
在 `.env` 文件中配置:
|
||
|
||
```
|
||
# 智谱 AI API Key(必需)
|
||
ZHIPUAI_API_KEY=your_api_key_here
|
||
|
||
# vLLM 本地模型 Token(可选)
|
||
VLLM_LOCAL_KEY=token-abc123
|
||
```
|
||
|
||
### 数据库配置
|
||
|
||
默认使用 PostgreSQL,连接字符串:
|
||
```
|
||
postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db
|
||
```
|
||
|
||
**注意**:
|
||
- **本地开发模式**:使用 `localhost` 或 `127.0.0.1`
|
||
- **Docker Compose 部署**:后端容器内应使用服务名 `postgres`(通过环境变量 `DB_URI` 自动配置)
|
||
|
||
如使用 Docker Compose,数据库会在内部网络中自动配置。
|
||
|
||
---
|
||
|
||
## 🐛 故障排查
|
||
|
||
### 常见问题
|
||
|
||
**Q: 无法连接 PostgreSQL?**
|
||
```bash
|
||
# 检查容器状态
|
||
docker ps | grep postgres
|
||
|
||
# 查看日志
|
||
docker logs postgres-langgraph
|
||
```
|
||
|
||
**Q: 后端启动失败?**
|
||
- 确认端口 8001 未被占用
|
||
- 检查 `.env` 中的 API Key 是否正确
|
||
- 查看启动日志确认模型初始化成功
|
||
|
||
**Q: 模型切换后无响应?**
|
||
- 检查所选模型的配置是否正确
|
||
- 确认 vLLM 容器是否运行(如使用本地模型)
|
||
- 尝试切换到另一个模型
|
||
|
||
更多问题排查请查看 [QUICKSTART.md](QUICKSTART.md)
|
||
|
||
---
|
||
|
||
## 📝 许可证
|
||
|
||
本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。
|
||
|
||
## 🤝 贡献
|
||
|
||
欢迎提交 Issue 和 Pull Request!
|