382 lines
12 KiB
Markdown
382 lines
12 KiB
Markdown
# 项目修改日志 (Changelog)
|
||
|
||
本文档记录了项目的主要功能修改和代码变更。
|
||
|
||
## 修改日期
|
||
2025-11-24
|
||
|
||
---
|
||
|
||
## 一、模型服务器 (Models Server) 修改
|
||
|
||
### 1.1 文件:`scripts/ai_agent/models/models_server.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**1. 配置解析改进**
|
||
- **位置**:`get_model_server()` 函数
|
||
- **修改**:
|
||
- 修正配置文件路径,使用 `project_root` 变量
|
||
- 添加配置文件读取错误检查(`read_json_file()` 返回 `None` 的情况)
|
||
- 支持 `models_server` 配置为列表或字典两种格式
|
||
- 修复 `global _process_instance` 声明位置(必须在函数开始处)
|
||
|
||
**2. 消息构建逻辑修复**
|
||
- **位置**:`_build_message()` 方法
|
||
- **修改**:
|
||
- 修复纯文本和多模态消息格式不一致的问题
|
||
- 纯文本推理:`system_prompt` 和 `user_prompt` 的 `content` 字段为字符串
|
||
- 多模态推理:`system_prompt` 和 `user_prompt` 的 `content` 字段为列表(包含文本和图像对象)
|
||
- 解决了 `TypeError: can only concatenate str (not "list") to str` 错误
|
||
|
||
**3. JSON Schema 支持**
|
||
- **位置**:`text_inference()`, `multimodal_inference()`, `model_inference()` 方法
|
||
- **修改**:
|
||
- 添加 `response_format` 参数支持,用于约束模型输出格式
|
||
- 当 `request.json_schema` 存在时,构建 `response_format` 对象传递给 `create_chat_completion`
|
||
- 格式:`{"type": "json_object", "schema": request.json_schema}`
|
||
|
||
**4. 错误处理增强**
|
||
- **位置**:`text_inference()` 方法
|
||
- **修改**:
|
||
- 添加 `messages` 为 `None` 的检查
|
||
- 显式设置 `image_data=None` 用于纯文本请求
|
||
- 改进错误日志,使用 `exc_info=True` 记录完整堆栈信息
|
||
|
||
**5. GPU 日志增强**
|
||
- **位置**:`init_vlm_llamacpp()` 方法
|
||
- **修改**:
|
||
- 当 `n_gpu_layers > 0` 时,设置 `verbose=True` 以输出 GPU 使用信息
|
||
- 添加 GPU 层数日志输出
|
||
|
||
**6. 主函数启用**
|
||
- **位置**:`main()` 函数
|
||
- **修改**:
|
||
- 取消注释 `uvicorn.run()` 调用,使模型服务器可以独立启动
|
||
|
||
---
|
||
|
||
### 1.2 文件:`scripts/ai_agent/models/model_definition.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**JSON Schema 字段添加**
|
||
- **位置**:`TextInferenceRequest` 和 `InferenceRequest` 类
|
||
- **修改**:
|
||
- 添加 `json_schema: Optional[Dict[str, Any]] = None` 字段
|
||
- 用于在推理请求中传递 JSON Schema,约束模型输出格式
|
||
|
||
---
|
||
|
||
### 1.3 文件:`scripts/ai_agent/models/models_client.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**Pydantic 兼容性改进**
|
||
- **位置**:`text_inference()` 和 `multimodal_inference()` 方法
|
||
- **修改**:
|
||
- 添加 Pydantic v1/v2 兼容的 JSON 序列化逻辑
|
||
- 优先使用 `model_dump_json()` (Pydantic v2)
|
||
- 降级使用 `json()` (Pydantic v1)
|
||
- 最后使用 `dict()`/`model_dump()` + `json.dumps()` 作为兜底方案
|
||
- 解决了 `Object of type TextInferenceRequest is not JSON serializable` 错误
|
||
|
||
**服务器等待逻辑改进**
|
||
- **位置**:`wait_for_server()` 方法
|
||
- **修改**:
|
||
- 接受 "loading" 状态作为有效状态
|
||
- 增强连接失败时的错误消息
|
||
|
||
---
|
||
|
||
## 二、后端服务 (Backend Service) 修改
|
||
|
||
### 2.1 文件:`scripts/ai_agent/groundcontrol/backend_service/src/main.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**子进程输出处理改进**
|
||
- **位置**:`start_model_server()` 函数
|
||
- **修改**:
|
||
- 使用线程实时输出模型服务器的 stdout 和 stderr
|
||
- 移除 `bufsize=1` 参数(二进制模式下不支持行缓冲)
|
||
- 解决了 `RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode` 警告
|
||
|
||
---
|
||
|
||
### 2.2 文件:`scripts/ai_agent/groundcontrol/backend_service/src/py_tree_generator.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**1. RAG 初始化改进**
|
||
- **位置**:`__init__()` 方法
|
||
- **修改**:
|
||
- 从 `rag_config.json` 读取 RAG 配置
|
||
- 计算 `ai_agent_root` 路径(相对于 `base_dir` 向上三级)
|
||
- 使用配置中的 `vectorstore_persist_directory` 和 `collection_name`
|
||
- 添加向量数据库加载状态日志
|
||
|
||
**2. JSON Schema 支持**
|
||
- **位置**:`generate()` 方法
|
||
- **修改**:
|
||
- 分类请求:传递 `classifier_schema` 约束输出格式
|
||
- 生成请求:根据模式(simple/complex)传递对应的 schema(`self.schema` 或 `self.simple_schema`)
|
||
- 确保模型输出符合预期的 JSON 结构
|
||
|
||
**3. RAG 检索调用更新**
|
||
- **位置**:`_retrieve_context()` 方法
|
||
- **修改**:
|
||
- 将 `score_threshold=0.6` 改为 `score_threshold=None`
|
||
- 使用自适应阈值,自动适应 L2 距离(ChromaDB 默认使用 L2 距离)
|
||
|
||
**4. 正则表达式修复**
|
||
- **位置**:`_parse_allowed_nodes_from_prompt()` 函数
|
||
- **修改**:
|
||
- 修复正则表达式,正确匹配 "可用节点定义" 部分
|
||
- 解决了 `ERROR - 在系统提示词中未找到'可用节点定义'部分的JSON代码块` 错误
|
||
|
||
---
|
||
|
||
## 三、RAG 系统 (Retrieval Augmented Generation) 修改
|
||
|
||
### 3.1 文件:`scripts/ai_agent/tools/memory_mag/rag/rag.py`
|
||
|
||
#### 修改内容:
|
||
|
||
**1. 向量数据库加载改进**
|
||
- **位置**:`load_vector_database()` 函数
|
||
- **修改**:
|
||
- 添加集合存在性检查(使用 ChromaDB 客户端)
|
||
- 列出所有可用集合及其文档数量
|
||
- 检查目标集合是否有数据
|
||
- 自动检测并提示有数据的集合
|
||
- 即使集合为空也返回数据库对象(允许后续添加数据)
|
||
- 添加详细的日志输出,包括集合信息和文档数量
|
||
|
||
**2. 检索逻辑优化**
|
||
- **位置**:`retrieve_relevant_info()` 函数
|
||
- **修改**:
|
||
- 将 `score_threshold` 默认值改为 `None`,支持自适应阈值
|
||
- 自适应阈值逻辑:
|
||
- 取前 k 个结果中的最高分数
|
||
- 乘以 1.5 作为阈值(确保包含所有前 k 个结果)
|
||
- 自动适应 L2 距离(分数范围通常在 10000-20000)
|
||
- 修复日志格式化错误(`score_threshold` 可能为 `None`)
|
||
- 添加相似度分数范围日志输出
|
||
- 解决了阈值过小(0.6)导致所有结果被过滤的问题
|
||
|
||
**3. 嵌入模型配置容错**
|
||
- **位置**:`set_embeddings()` 函数
|
||
- **修改**:
|
||
- 使用 `.get()` 方法访问 `model_config` 参数,提供默认值
|
||
- 支持的参数:`n_ctx`, `n_threads`, `n_gpu_layers`, `n_seq_max`, `n_threads_batch`, `flash_attn`, `verbose`
|
||
- 解决了 `KeyError: 'n_threads_batch'` 等配置缺失错误
|
||
|
||
---
|
||
|
||
### 3.2 文件:`scripts/ai_agent/config/rag_config.json`
|
||
|
||
#### 修改内容:
|
||
|
||
**配置更新**
|
||
- **修改项**:
|
||
1. `vectorstore_persist_directory`:更新为 `/home/huangfukk/AI_Agent/scripts/ai_agent/memory/knowledge_base/map/vector_store/osm_map1`
|
||
2. `embedding_model_path`:更新为 `/home/huangfukk/models/gguf/Qwen/Qwen3-Embedding-4B/Qwen3-Embedding-4B-Q4_K_M.gguf`
|
||
3. `collection_name`:从 `"osm_map_docs"` 改为 `"drone_docs"`(使用有数据的集合)
|
||
4. `model_config_llamacpp`:添加 `n_threads_batch: 4` 字段
|
||
|
||
---
|
||
|
||
### 3.3 文件:`scripts/ai_agent/config/model_config.json`
|
||
|
||
#### 修改内容:
|
||
|
||
**模型配置更新**
|
||
- **修改项**:
|
||
1. `verbose`:从 `0` 改为 `1`(启用详细日志)
|
||
2. `n_gpu_layers`:设置为 `40`(启用 GPU 加速)
|
||
|
||
---
|
||
|
||
## 四、主要问题修复总结
|
||
|
||
### 4.1 已修复的错误
|
||
|
||
1. **模型服务器启动超时**
|
||
- **原因**:`main()` 函数被注释,服务器无法启动
|
||
- **修复**:取消注释 `uvicorn.run()` 调用
|
||
|
||
2. **配置解析 KeyError**
|
||
- **原因**:`models_server` 配置格式不一致(列表 vs 字典)
|
||
- **修复**:添加格式判断,支持两种格式
|
||
|
||
3. **消息格式类型错误**
|
||
- **原因**:纯文本和多模态消息格式混用
|
||
- **修复**:区分纯文本(字符串)和多模态(列表)格式
|
||
|
||
4. **JSON 序列化错误**
|
||
- **原因**:Pydantic 模型直接序列化失败
|
||
- **修复**:添加 Pydantic v1/v2 兼容的序列化逻辑
|
||
|
||
5. **RAG 检索返回空结果**
|
||
- **原因**:
|
||
- 集合名称不匹配(`osm_map_docs` 为空,`drone_docs` 有数据)
|
||
- 相似度阈值过小(0.6),而 L2 距离分数通常在 10000+ 范围
|
||
- **修复**:
|
||
- 更新集合名称为 `drone_docs`
|
||
- 实现自适应阈值机制
|
||
|
||
6. **配置缺失 KeyError**
|
||
- **原因**:`rag_config.json` 缺少 `n_threads_batch` 字段
|
||
- **修复**:添加字段,并在代码中使用 `.get()` 提供默认值
|
||
|
||
---
|
||
|
||
## 五、新增功能
|
||
|
||
### 5.1 JSON Schema 约束输出
|
||
|
||
- **功能描述**:支持在推理请求中传递 JSON Schema,约束模型输出格式
|
||
- **应用场景**:
|
||
- 分类任务:确保输出符合 `{"mode": "simple"|"complex"}` 格式
|
||
- 生成任务:确保输出符合 Pytree JSON 结构
|
||
- **实现位置**:
|
||
- `model_definition.py`:添加 `json_schema` 字段
|
||
- `models_server.py`:构建 `response_format` 参数
|
||
- `py_tree_generator.py`:传递动态生成的 schema
|
||
|
||
### 5.2 自适应相似度阈值
|
||
|
||
- **功能描述**:根据检索结果自动调整相似度阈值
|
||
- **优势**:
|
||
- 自动适应不同的距离度量(L2、余弦距离等)
|
||
- 无需手动调整阈值参数
|
||
- 确保返回前 k 个最相关的结果
|
||
- **实现位置**:`rag.py` 的 `retrieve_relevant_info()` 函数
|
||
|
||
### 5.3 向量数据库诊断功能
|
||
|
||
- **功能描述**:加载向量数据库时自动检查集合状态
|
||
- **功能**:
|
||
- 列出所有可用集合
|
||
- 显示每个集合的文档数量
|
||
- 提示有数据的集合
|
||
- 诊断集合不存在或为空的情况
|
||
- **实现位置**:`rag.py` 的 `load_vector_database()` 函数
|
||
|
||
---
|
||
|
||
## 六、配置变更
|
||
|
||
### 6.1 必须更新的配置
|
||
|
||
1. **`rag_config.json`**
|
||
- 更新 `vectorstore_persist_directory` 路径
|
||
- 更新 `embedding_model_path` 路径
|
||
- 更新 `collection_name` 为有数据的集合
|
||
- 确保 `model_config_llamacpp` 包含所有必需字段
|
||
|
||
2. **`model_config.json`**
|
||
- 根据需求调整 `n_gpu_layers`(GPU 加速层数)
|
||
- 根据需求调整 `verbose`(日志详细程度)
|
||
|
||
---
|
||
|
||
## 七、测试建议
|
||
|
||
### 7.1 功能测试
|
||
|
||
1. **模型服务器启动测试**
|
||
```bash
|
||
cd scripts/ai_agent/models
|
||
python models_server.py
|
||
```
|
||
|
||
2. **RAG 检索测试**
|
||
```python
|
||
from tools.memory_mag.rag.rag import set_embeddings, load_vector_database, retrieve_relevant_info
|
||
# 测试检索功能
|
||
```
|
||
|
||
3. **JSON Schema 约束测试**
|
||
- 发送分类请求,验证输出格式
|
||
- 发送生成请求,验证 Pytree JSON 结构
|
||
|
||
### 7.2 集成测试
|
||
|
||
1. **端到端测试**
|
||
- 启动后端服务
|
||
- 发送 "起飞,飞到匡亚明学院" 请求
|
||
- 验证 RAG 检索是否返回地点信息
|
||
- 验证生成的 Pytree 是否包含正确的地点坐标
|
||
|
||
---
|
||
|
||
## 八、注意事项
|
||
|
||
1. **向量数据库集合**
|
||
- 确保使用有数据的集合(当前为 `drone_docs`)
|
||
- 如果更换集合,需要更新 `rag_config.json` 中的 `collection_name`
|
||
|
||
2. **嵌入模型路径**
|
||
- 确保嵌入模型路径正确
|
||
- 嵌入模型必须与向量数据库创建时使用的模型一致
|
||
|
||
3. **GPU 配置**
|
||
- 根据硬件配置调整 `n_gpu_layers`
|
||
- 如果使用 CPU,设置 `n_gpu_layers=0`
|
||
|
||
4. **日志级别**
|
||
- 生产环境建议设置 `verbose=0`
|
||
- 调试时可以使用 `verbose=1` 查看详细信息
|
||
|
||
---
|
||
|
||
## 九、后续优化建议
|
||
|
||
1. **性能优化**
|
||
- 考虑缓存嵌入模型实例
|
||
- 优化向量数据库查询性能
|
||
|
||
2. **错误处理**
|
||
- 添加更细粒度的错误分类
|
||
- 提供更友好的错误消息
|
||
|
||
3. **配置管理**
|
||
- 考虑使用环境变量覆盖配置
|
||
- 添加配置验证逻辑
|
||
|
||
4. **文档完善**
|
||
- 添加 API 文档
|
||
- 添加部署指南
|
||
|
||
---
|
||
|
||
## 十、启动脚本
|
||
|
||
### 10.1 后端服务启动脚本
|
||
|
||
**文件**:`scripts/ai_agent/groundcontrol/backend_service/start_backend.sh`
|
||
|
||
**功能**:
|
||
- 提供便捷的后端服务启动方式
|
||
- 自动设置工作目录和 Python 路径
|
||
- 启动 FastAPI 后端服务,监听 `0.0.0.0:8001`
|
||
|
||
**使用方法**:
|
||
```bash
|
||
cd scripts/ai_agent/groundcontrol/backend_service
|
||
./start_backend.sh
|
||
```
|
||
|
||
**脚本内容**:
|
||
- 自动切换到脚本所在目录
|
||
- 设置 Python 路径
|
||
- 使用 uvicorn 启动 FastAPI 应用:`python -m uvicorn src.main:app --host 0.0.0.0 --port 8001`
|
||
|
||
---
|
||
|
||
**文档版本**:1.1
|
||
**最后更新**:2025-11-24
|
||
|