Files
ai_agent/CHANGELOG.md
2025-11-24 20:10:33 +08:00

382 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目修改日志 (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