本项目由三部分组成:
- Spring Boot 应用(MCP 工具暴露、对话与转发)
- Python 推理服务(YOLOv10 目标检测 HTTP 服务)
- abcd 数据管线(爬取→抽取→威胁评估,可独立运行)
src/main/java/com/example/springbootmcp/
controller/
ChatController.java # 对话入口与页面路由
ConfigController.java # LLM 配置管理页面/接口
DetectController.java # /api/detect → 转发到 Python /infer
mcp/
DetectToolsService.java # MCP 工具:本地读图→调用 /api/detect
JdbcQueryService.java # MCP 工具:示例查询(shuaige 等)
McpConfig.java # 注册 MCP 工具 Provider
model/
ChatMessage.java # 消息实体
ChatRequest.java # 对话请求
FunctionCallRequest.java # 标准 Function Calling 请求体
FunctionDefinition.java # 函数定义模型
LlmConfig.java # LLM 配置实体(H2)
LlmType.java # LLM 类型(LOCAL/REMOTE)
repository/
LlmConfigRepository.java # JPA 仓库
service/
FunctionCallingService.java # 远程 LLM(Function Calling)调用编排
LlmConfigService.java # 配置 CRUD/激活
OllamaToolCallingService.java # 本地 LLM 智能工具调用(TOOL_CALL 协议)
src/main/resources/
application.properties # 端口/限流;Python 服务地址;H2/JPA;LLM/MCP;HTTP/日志
templates/
index.html # 首页(对话 + MCP 工具说明)
config.html # 配置管理页面
static/
css/style.css
js/chat.js # 前端交互逻辑(调用 /api/chat、展示消息)
pom.xml
- Spring Web、Spring AI MCP(client/server)、HttpClient5、JPA/H2(测试/内存)
文件:python/server.py
- 端点:
GET /health、POST /infer(multipart 字段file) - 环境变量:
YOLO_HTTP_HOST、YOLO_HTTP_PORT、YOLO_MODEL - 依赖:见
python/requirements.txt(PyTorch/YOLOv10 需按环境安装) - 启动:
python python\server.py
# 或 PowerShell 脚本
.\python\start-server.ps1 -Host 127.0.0.1 -Port 8001 -Model yolov10n.pt
- 本地 LLM:
OllamaToolCallingService- 通过提示词协议
TOOL_CALL: detectImage("…")/shuaige()触发工具 - 工具执行后结果回注给模型生成答复
- 通过提示词协议
- 远程 LLM:
FunctionCallingService- 构建标准 Function Calling(
FunctionDefinition) - 执行工具后将结果拼入对话再次调用模型
- 构建标准 Function Calling(
- 工具实现:
DetectToolsService.detectFromPath(imagePath)→ 调用当前应用/api/detect→ 转发到 Python/inferJdbcQueryService.shuaige()返回固定演示字符串
- a_crawl:
crawler.py(Crawl4AI + DeepSeek 提取结构化字段)、download_images.py(图片下载+更新 JSON) - b_extract:
info_extract.py(jionlp 摘要、RAG 召回、Qwen2.5-VL 生成描述,输出 CSV) - c_threat:
threat_val.py(TF-IDF + XGBoost 训练/预测,生成c_threat/threat_model/xgb_threat_model.json)
- 启动 Python 推理服务
python python\server.py
# 验证
curl http://127.0.0.1:8001/health
- 启动 Spring Boot
mvn spring-boot:run
- 自测检测
curl -X POST http://localhost:8080/api/detect -F "file=@D:/images/test.jpg"
- Web 界面
- 访问
http://localhost:8080/ - 在
配置管理页面添加/激活 LLM 配置(本地/远程) - 在首页对话框输入 “检测 D:\图片\test.jpg” 触发图片检测
application.properties中的示例 API Key 与直连 Host 仅用于调试,请改为环境变量并谨慎使用。- Python 端 YOLOv10 模型文件路径需存在,确保可信来源;若使用 GPU,自行匹配 PyTorch/CUDA 版本。
- abcd 管线使用到的第三方 API/网站请遵守服务条款(请替换示例密钥)。
本次在保持 abcd/ 目录不变的前提下,将 b(信息抽取)与 c(威胁评估)两类算法以封装形式整合进 python/,并通过 Spring Boot 转发与 MCP 工具对外暴露。
- 目录与封装
python/algorithms/
__init__.py
info_extractor.py # 封装 abcd/b_extract/info_extract.main → extract_info()
threat_eval.py # 封装 abcd/c_threat/threat_val → train()/predict()
- 服务端新增端点(位于
python/server.py)
POST /extract-info # 入参: { json_str?, csv_save_path? } 返回: {results, csv_path}
POST /threat/train # 入参: { input_list? } 返回: {model_dir}
POST /threat/predict # 入参: { input_list? } 返回: {predictions}
- 依赖
- 已在
python/requirements.txt增补:jionlp、transformers、chromadb、sentence-transformers、pypdf、pandas、jieba、scikit-learn、scipy、xgboost 等。
- 已在
- 新增/修改接口(
controller/DetectController.java)
POST /api/extract-info -> 转发到 Python /extract-info
POST /api/threat/train -> 转发到 Python /threat/train
POST /api/threat/predict -> 转发到 Python /threat/predict
- MCP 工具(
mcp/)
AbcdToolsService.java
- extractInfo(jsonStr, csvSavePath)
- threatTrain(inputListJson)
- threatPredict(inputListJson)
McpConfig.java
- 注册 AbcdToolsService 与既有工具
- 启动 Python 服务
python python\server.py
# 健康检查
curl http://127.0.0.1:8001/health
- 启动 Spring Boot
mvn spring-boot:run
- HTTP 自测
# 信息抽取(示例:仅指定 CSV 路径)
curl -X POST http://localhost:8080/api/extract-info \
-H "Content-Type: application/json" \
-d "{\"json_str\": null, \"csv_save_path\": \"D:\\out.csv\"}"
# 威胁评估训练(传入或留空均可)
curl -X POST http://localhost:8080/api/threat/train \
-H "Content-Type: application/json" \
-d "{\"input_list\":[[0,\"这是摘要\",\"这是图像描述\"]]}"
# 威胁评估预测
curl -X POST http://localhost:8080/api/threat/predict \
-H "Content-Type: application/json" \
-d "{\"input_list\":[[0,\"这是摘要\",\"这是图像描述\"]]}"
- MCP 工具
- 在 MCP 客户端中可直接调用:
extractInfo(jsonStr?, csvSavePath?)threatTrain(inputListJson?)threatPredict(inputListJson?)
- GPU/模型依赖:
abcd/b_extract/info_extract.py使用 Qwen2.5-VL(默认 CUDA),无 GPU 时可能失败;可在后续封装中加入 CPU 降级开关。 - RAG 模型与索引:信息抽取使用的向量模型与 Chroma 索引路径可能需要根据你的环境调整(
b_extract/rag/build_db)。 - YOLOv10 模型路径:
python/server.py中MODEL_PATH为绝对路径,请确保存在或改为环境变量。
目标:让支持 Function Calling 的远程大模型,或本地 LLM(通过 MCP 工具)调用“信息抽取(b)”与“威胁评估(c)”
- Python 服务已启动,且包含端点:
/extract-info、/threat/train、/threat/predict - Spring Boot 已启动:
/api/extract-info、/api/threat/train、/api/threat/predict能正常转发 - 在
配置管理中已配置并激活一个 LLM:- 远程 LLM(支持 Function Calling,例如 OpenAI 兼容接口):填写
baseUrl、apiKey、modelName - 本地 LLM(Ollama 等):填写模型名称,例如
llama3
- 远程 LLM(支持 Function Calling,例如 OpenAI 兼容接口):填写
- Function 定义(系统自动注入,无需手工配置)
- extractInfo(jsonStr?, csvSavePath?)
- threatTrain(inputList?)
- threatPredict(inputList?)
- 触发方式
- 在首页“对话界面”输入自然语言,例如:
- “请做一次信息抽取,结果保存到 D:\out.csv”
- “用以下数据训练威胁模型:[[0,"摘要1","图像描述1"]],然后预测同一批输入”
- 服务会自动将你的话语与函数定义一起发送给远程 LLM;当 LLM 选择调用函数时,后端会:
- 将调用路由到
AbcdToolsService→ 调用 Spring/api/...→ Python 端对应/extract-info或/threat/* - 获取结果后再次发给 LLM,让其生成最终回答
- 将调用路由到
- 显式测试(HTTP)
- 可直接用 curl 调用 Spring Boot 转发端点(见“运行与自测”一节)
- MCP 工具列表(
mcp/AbcdToolsService暴露)
- extractInfo(jsonStr?, csvSavePath?)
- threatTrain(inputListJson?)
- threatPredict(inputListJson?)
- 触发方式
- 在你的 MCP 客户端(例如 Dify 或本地集成)连接本应用的 MCP 服务器后,直接调用上述工具:
extractInfo(null, "D:\\out.csv")threatTrain("[[0, \"摘要\", \"图像描述\"]]")threatPredict("[[0, \"摘要\", \"图像描述\"]]")
- 工具执行链路:MCP 工具 → Spring
/api/...→ Python 端/extract-info或/threat/*→ 返回结果
- 信息抽取
- “如果需要进行信息抽取,请调用
extractInfo函数。当我提供 json 字符串时用jsonStr,需要落盘时设置csvSavePath(以 .csv 结尾)。” - “示例:请对上一步的 json 做信息抽取,CSV 存到 D:\out.csv。”
- “如果需要进行信息抽取,请调用
- 威胁评估
- “如果需要训练/预测威胁模型,请分别调用
threatTrain和threatPredict函数。输入为二维数组 [[label, text_summary, image_caption], ...]。” - “示例:用 [[0,"这是摘要","这是图像描述"]] 训练,然后对同一批数据做预测。”
- “如果需要训练/预测威胁模型,请分别调用
- GPU 环境:信息抽取默认使用 Qwen2.5-VL(CUDA),无 GPU 可能失败。可考虑在后续增加 CPU 降级参数(保持 abcd 不变)。
- 向量/索引:RAG 模型与 Chroma 索引路径根据你的环境准备;未准备时会自动降级为纯文本描述(若算法内支持)。
- 路径与编码:Windows 下路径用双反斜杠转义;中文参数请使用 UTF-8 编码。