12 KiB
12 KiB
项目修改日志 (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
修改内容:
配置更新
- 修改项:
vectorstore_persist_directory:更新为/home/huangfukk/AI_Agent/scripts/ai_agent/memory/knowledge_base/map/vector_store/osm_map1embedding_model_path:更新为/home/huangfukk/models/gguf/Qwen/Qwen3-Embedding-4B/Qwen3-Embedding-4B-Q4_K_M.ggufcollection_name:从"osm_map_docs"改为"drone_docs"(使用有数据的集合)model_config_llamacpp:添加n_threads_batch: 4字段
3.3 文件:scripts/ai_agent/config/model_config.json
修改内容:
模型配置更新
- 修改项:
verbose:从0改为1(启用详细日志)n_gpu_layers:设置为40(启用 GPU 加速)
四、主要问题修复总结
4.1 已修复的错误
-
模型服务器启动超时
- 原因:
main()函数被注释,服务器无法启动 - 修复:取消注释
uvicorn.run()调用
- 原因:
-
配置解析 KeyError
- 原因:
models_server配置格式不一致(列表 vs 字典) - 修复:添加格式判断,支持两种格式
- 原因:
-
消息格式类型错误
- 原因:纯文本和多模态消息格式混用
- 修复:区分纯文本(字符串)和多模态(列表)格式
-
JSON 序列化错误
- 原因:Pydantic 模型直接序列化失败
- 修复:添加 Pydantic v1/v2 兼容的序列化逻辑
-
RAG 检索返回空结果
- 原因:
- 集合名称不匹配(
osm_map_docs为空,drone_docs有数据) - 相似度阈值过小(0.6),而 L2 距离分数通常在 10000+ 范围
- 集合名称不匹配(
- 修复:
- 更新集合名称为
drone_docs - 实现自适应阈值机制
- 更新集合名称为
- 原因:
-
配置缺失 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 必须更新的配置
-
rag_config.json- 更新
vectorstore_persist_directory路径 - 更新
embedding_model_path路径 - 更新
collection_name为有数据的集合 - 确保
model_config_llamacpp包含所有必需字段
- 更新
-
model_config.json- 根据需求调整
n_gpu_layers(GPU 加速层数) - 根据需求调整
verbose(日志详细程度)
- 根据需求调整
七、测试建议
7.1 功能测试
-
模型服务器启动测试
cd scripts/ai_agent/models python models_server.py -
RAG 检索测试
from tools.memory_mag.rag.rag import set_embeddings, load_vector_database, retrieve_relevant_info # 测试检索功能 -
JSON Schema 约束测试
- 发送分类请求,验证输出格式
- 发送生成请求,验证 Pytree JSON 结构
7.2 集成测试
- 端到端测试
- 启动后端服务
- 发送 "起飞,飞到匡亚明学院" 请求
- 验证 RAG 检索是否返回地点信息
- 验证生成的 Pytree 是否包含正确的地点坐标
八、注意事项
-
向量数据库集合
- 确保使用有数据的集合(当前为
drone_docs) - 如果更换集合,需要更新
rag_config.json中的collection_name
- 确保使用有数据的集合(当前为
-
嵌入模型路径
- 确保嵌入模型路径正确
- 嵌入模型必须与向量数据库创建时使用的模型一致
-
GPU 配置
- 根据硬件配置调整
n_gpu_layers - 如果使用 CPU,设置
n_gpu_layers=0
- 根据硬件配置调整
-
日志级别
- 生产环境建议设置
verbose=0 - 调试时可以使用
verbose=1查看详细信息
- 生产环境建议设置
九、后续优化建议
-
性能优化
- 考虑缓存嵌入模型实例
- 优化向量数据库查询性能
-
错误处理
- 添加更细粒度的错误分类
- 提供更友好的错误消息
-
配置管理
- 考虑使用环境变量覆盖配置
- 添加配置验证逻辑
-
文档完善
- 添加 API 文档
- 添加部署指南
十、启动脚本
10.1 后端服务启动脚本
文件:scripts/ai_agent/groundcontrol/backend_service/start_backend.sh
功能:
- 提供便捷的后端服务启动方式
- 自动设置工作目录和 Python 路径
- 启动 FastAPI 后端服务,监听
0.0.0.0:8001
使用方法:
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