first commit

This commit is contained in:
2025-11-24 20:10:33 +08:00
parent 4a7cfb1cee
commit 12cfcc2681
20 changed files with 668 additions and 247 deletions

381
CHANGELOG.md Normal file
View File

@@ -0,0 +1,381 @@
# 项目修改日志 (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