242 lines
6.4 KiB
Markdown
242 lines
6.4 KiB
Markdown
|
|
# Assistant-UI + LangGraph + FastAPI Web Chatbot
|
|||
|
|
|
|||
|
|
本项目成功集成了 assistant-ui 前端框架与基于 LangGraph + FastAPI 的后端服务,实现了流式 AI 对话界面,支持多步推理和工具调用。
|
|||
|
|
|
|||
|
|
## 项目架构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|||
|
|
│ React Web │ │ Next.js API │ │ FastAPI+ │
|
|||
|
|
│ (assistant-ui) │◄──►│ Route │◄──►│ LangGraph │
|
|||
|
|
│ │ │ │ │ Backend │
|
|||
|
|
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
▼ ▼ ▼
|
|||
|
|
用户界面 API 代理/转发 AI Agent + 工具
|
|||
|
|
- Thread 组件 - /api/chat 路由 - 检索工具
|
|||
|
|
- Tool UI 显示 - Data Stream 协议 - 代码分析
|
|||
|
|
- 流式消息渲染 - 请求转发处理 - 多步推理
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 核心特性
|
|||
|
|
|
|||
|
|
### 1. 前端 (assistant-ui)
|
|||
|
|
|
|||
|
|
- **框架**: Next.js 15 + React 19 + TypeScript + Tailwind CSS v3
|
|||
|
|
- **UI 库**: @assistant-ui/react, @assistant-ui/react-ui
|
|||
|
|
- **协议**: Data Stream Protocol (SSE 流式通信)
|
|||
|
|
- **组件**:
|
|||
|
|
- `Thread`: 主对话界面
|
|||
|
|
- 自定义 Tool UI: 文档检索、Web搜索、代码执行等
|
|||
|
|
- 响应式设计,支持明暗主题
|
|||
|
|
|
|||
|
|
### 2. 中间层 (Next.js API)
|
|||
|
|
|
|||
|
|
- **路由**: `/api/chat` - 转发请求到 FastAPI 后端
|
|||
|
|
- **协议转换**: 确保 Data Stream Protocol 兼容性
|
|||
|
|
- **headers**: 设置正确的 `x-vercel-ai-data-stream: v1` 头
|
|||
|
|
|
|||
|
|
### 3. 后端 (FastAPI + LangGraph)
|
|||
|
|
|
|||
|
|
- **框架**: FastAPI + LangGraph
|
|||
|
|
- **协议**: AI SDK Data Stream Protocol
|
|||
|
|
- **功能**:
|
|||
|
|
- 多步 AI 推理
|
|||
|
|
- 工具调用 (检索、搜索、代码分析等)
|
|||
|
|
- 会话状态管理
|
|||
|
|
- 流式响应
|
|||
|
|
|
|||
|
|
## 安装和配置
|
|||
|
|
|
|||
|
|
### 1. 后端服务
|
|||
|
|
|
|||
|
|
确保后端服务在端口 8000 运行:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /home/fl/code/ai-solution/agentic-rag-4
|
|||
|
|
./start_service.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 前端应用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd web
|
|||
|
|
pnpm install
|
|||
|
|
pnpm dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
访问: http://localhost:3000
|
|||
|
|
|
|||
|
|
## 技术实现细节
|
|||
|
|
|
|||
|
|
### Data Stream Protocol
|
|||
|
|
|
|||
|
|
实现了 AI SDK 标准的 Data Stream Protocol:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
类型格式: TYPE_ID:CONTENT_JSON\n
|
|||
|
|
|
|||
|
|
支持的事件类型:
|
|||
|
|
- 0: 文本流 (text)
|
|||
|
|
- 2: 数据 (data)
|
|||
|
|
- 3: 错误 (error)
|
|||
|
|
- 9: 工具调用 (tool call)
|
|||
|
|
- a: 工具结果 (tool result)
|
|||
|
|
- d: 消息完成 (finish message)
|
|||
|
|
- e: 步骤完成 (finish step)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 工具 UI 自定义
|
|||
|
|
|
|||
|
|
定义了多个工具的可视化组件:
|
|||
|
|
|
|||
|
|
1. **文档检索工具** (`retrieval`)
|
|||
|
|
- 显示检索到的文档
|
|||
|
|
- 相关度评分
|
|||
|
|
- 来源信息
|
|||
|
|
|
|||
|
|
2. **Web 搜索工具** (`web_search`)
|
|||
|
|
- 搜索结果列表
|
|||
|
|
- 链接和摘要
|
|||
|
|
- 执行时间
|
|||
|
|
|
|||
|
|
3. **代码执行工具** (`python`)
|
|||
|
|
- 代码高亮显示
|
|||
|
|
- stdout/stderr 输出
|
|||
|
|
- 执行状态
|
|||
|
|
|
|||
|
|
4. **URL 抓取工具** (`fetch_url`)
|
|||
|
|
- 页面标题和内容
|
|||
|
|
- 错误处理
|
|||
|
|
|
|||
|
|
### 流式集成
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 前端运行时配置
|
|||
|
|
const runtime = useDataStreamRuntime({
|
|||
|
|
api: "/api/chat",
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 后端事件转换
|
|||
|
|
async function stream_ai_sdk_compatible(internal_stream) {
|
|||
|
|
for await (const event of internal_stream) {
|
|||
|
|
const converted = adapter.convert_event(event);
|
|||
|
|
if (converted) yield converted;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 文件结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
web/
|
|||
|
|
├── src/
|
|||
|
|
│ ├── app/
|
|||
|
|
│ │ ├── page.tsx # 主聊天界面
|
|||
|
|
│ │ ├── globals.css # 全局样式 + assistant-ui
|
|||
|
|
│ │ ├── layout.tsx # 布局配置
|
|||
|
|
│ │ └── api/
|
|||
|
|
│ │ └── chat/
|
|||
|
|
│ │ └── route.ts # API 路由代理
|
|||
|
|
│ └── ...
|
|||
|
|
├── tailwind.config.ts # Tailwind + assistant-ui 插件
|
|||
|
|
├── package.json # 依赖配置
|
|||
|
|
└── ...
|
|||
|
|
|
|||
|
|
service/
|
|||
|
|
├── ai_sdk_adapter.py # Data Stream Protocol 适配器
|
|||
|
|
├── ai_sdk_chat.py # AI SDK 兼容的聊天端点
|
|||
|
|
├── main.py # FastAPI 应用入口
|
|||
|
|
└── ...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 使用指南
|
|||
|
|
|
|||
|
|
### 1. 启动对话
|
|||
|
|
|
|||
|
|
打开 http://localhost:3000,在输入框中输入问题,例如:
|
|||
|
|
- "帮我搜索关于 Python 异步编程的资料"
|
|||
|
|
- "分析一下这段代码的性能问题"
|
|||
|
|
- "检索关于机器学习的文档"
|
|||
|
|
|
|||
|
|
### 2. 观察工具调用
|
|||
|
|
|
|||
|
|
AI 助手会根据问题自动调用相应工具:
|
|||
|
|
- 文档检索会显示相关文档卡片
|
|||
|
|
- Web 搜索会显示搜索结果列表
|
|||
|
|
- 代码分析会显示执行过程和结果
|
|||
|
|
|
|||
|
|
### 3. 多步推理
|
|||
|
|
|
|||
|
|
助手支持复杂的多步推理流程,每个步骤都会实时显示进度。
|
|||
|
|
|
|||
|
|
## 开发和调试
|
|||
|
|
|
|||
|
|
### 查看后端日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
tail -f service.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 检查 Data Stream 协议
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -N -H "Content-Type: application/json" \
|
|||
|
|
-d '{"messages":[{"role":"user","content":"Hello"}],"session_id":"test"}' \
|
|||
|
|
http://localhost:8000/api/ai-sdk/chat
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 前端开发
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd web
|
|||
|
|
pnpm dev
|
|||
|
|
# 访问 http://localhost:3000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 协议兼容性确认
|
|||
|
|
|
|||
|
|
✅ **Data Stream Protocol 兼容**
|
|||
|
|
- 正确的事件格式: `TYPE_ID:JSON\n`
|
|||
|
|
- 必需的 HTTP 头: `x-vercel-ai-data-stream: v1`
|
|||
|
|
- 支持工具调用流式渲染
|
|||
|
|
- 支持多步推理可视化
|
|||
|
|
|
|||
|
|
✅ **assistant-ui 集成**
|
|||
|
|
- useDataStreamRuntime 正确配置
|
|||
|
|
- Thread 组件正常渲染
|
|||
|
|
- 自定义 Tool UI 正常显示
|
|||
|
|
- 样式和主题配置正确
|
|||
|
|
|
|||
|
|
✅ **LangGraph + FastAPI 后端**
|
|||
|
|
- 事件正确转换为 Data Stream Protocol
|
|||
|
|
- 工具调用和结果正确传输
|
|||
|
|
- 会话状态正确管理
|
|||
|
|
- 错误处理和异常流处理
|
|||
|
|
|
|||
|
|
## 后续优化建议
|
|||
|
|
|
|||
|
|
1. **性能优化**
|
|||
|
|
- 实现消息缓存
|
|||
|
|
- 添加请求去重
|
|||
|
|
- 优化大文件传输
|
|||
|
|
|
|||
|
|
2. **功能扩展**
|
|||
|
|
- 添加更多工具 UI
|
|||
|
|
- 支持文件上传
|
|||
|
|
- 实现消息编辑和分支
|
|||
|
|
|
|||
|
|
3. **用户体验**
|
|||
|
|
- 添加加载状态指示
|
|||
|
|
- 实现消息重试机制
|
|||
|
|
- 支持键盘快捷键
|
|||
|
|
|
|||
|
|
4. **部署和监控**
|
|||
|
|
- 添加性能监控
|
|||
|
|
- 实现日志聚合
|
|||
|
|
- 配置生产环境部署
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
本项目成功实现了 assistant-ui 与 LangGraph + FastAPI 的无缝集成,提供了完整的流式 AI 对话体验。通过标准的 Data Stream Protocol,确保了前后端的协议兼容性,同时通过自定义 Tool UI 提供了丰富的交互体验。整个架构具有良好的可扩展性和维护性,为进一步的功能开发和优化奠定了坚实基础。
|