使用说明
CiqualMcp
质量:
代码库:
一个同时探索两件事的小型实验项目:
- 基于Spring AI的MCP(模型上下文协议) --使用Spring AI的服务器/客户端启动器通过MCP标准公开和使用工具。
- 基于人工智能的CIQUAL数据库搜索 --通过自然语言查询法国官方食品成分数据库。
什么是CIQUAL?
CIQUAL 是ANSES发布的法国食品成分数据库。它包含每100克数千种食物的营养数据(常量营养素、维生素、矿物质、能量等)。该项目将2025版本的CIQUAL打包为XML文件,并将其解析到内存中的数据库中。
建筑学
该项目是一个Maven多模块应用程序,具有两个Spring Boot服务:
CiqualMcp/
├── CiqualMcpServer/ ← MCP server exposing food search tools (port 8080)
└── CiqualMcpClient/ ← MCP client + web chat interface (port 8081)
服务器(CiqualMcpServer)
- 启动时将CIQUAL XML文件解析为内存丰富的数据库。
- 暴露a
searchFood通过MCP使用工具spring-ai-starter-mcp-server-webmvc. - 该工具对食物名称(法语、英语、科学)和食物组进行语义/模糊搜索,返回常量营养素数据(每100克碳水化合物、脂肪、蛋白质、卡路里)。
客户(CiqualMcpClient)
- 使用SSE连接到MCP服务器
spring-ai-starter-mcp-client. - 使用OpenAI(
gpt-4o-mini)通过Spring AIChatClient. - 提供REST端点(
POST /api/chat)以及用于与营养助理聊天的简单网络UI。 - 当用户询问食物问题时,LLM会自动调用
searchFoodMCP服务器上的工具,用于获取真实的CIQUAL数据并将其合并到其答案中。
数据流
User (browser)
└─► ChatController (port 8081)
└─► Spring AI ChatClient → OpenAI gpt-4o-mini
└─► [tool call] MCP Client
└─► MCP Server (port 8080)
└─► FoodSearchTools → EnrichedCiqualDatabase
└─► SemanticFoodSearch (fuzzy + synonym matching)
└─► CIQUAL XML data
关键实施细节
- 语义搜索:与Levenshtein距离的模糊匹配+同义词扩展(法语和英语食品术语)+食品名称、英文名称、学名和组层次结构的加权多字段评分。
- 营养提取:常量营养素(碳水化合物、脂肪、蛋白质、纤维、酒精)、能量(千卡/千焦)、维生素、矿物质、脂肪酸——所有这些都由CIQUAL成分代码标识。
- 卡路里估算:根据宏计算,使用4-4-9-7规则(每克碳水化合物/蛋白质/脂肪/酒精千卡)。
- MCP传输:基于SSE的同步MCP,完全通过Spring AI配置连接,使用最少的样板。
技术栈
| 层 | 技术 |
|---|---|
| 语言 | Java 21 |
| 框架 | Spring Boot 3.4.1 |
| AI集成 | Spring AI 1.0.0 |
| 协议 | 模型上下文协议(MCP) |
| LLM | OpenAI gpt-4o-mini |
| 数据 | CIQUAL 2025(XML) |
| 构建 | Maven |
在本地运行
先决条件
- Java 21+
- 梅文
- 一个OpenAI API密钥
启动MCP服务器
cd CiqualMcpServer
mvn spring-boot:run
服务器在端口8080上启动。解析CIQUAL XML文件需要一些时间(合成文件约为67 MB)。
启动MCP客户端
cd CiqualMcpClient
OPENAI_API_KEY=sk-... mvn spring-boot:run
客户端在端口8081上启动。
使用聊天界面
打开 http://localhost:8081 然后问这样的问题:
- “鸡胸中的常量营养素是什么?”
- “每100克布里干酪含有多少卡路里?”
- “比较扁豆和牛肉的蛋白质含量。”
项目目标
这是有意的小规模和探索性的。主要目标是:
- 亲自动手 Spring AI的MCP支持 (服务器和客户端启动器、工具注册、SSE传输)。
- 看看一个简单的 语义搜索 可以将自然语言食物查询路由到结构化的CIQUAL数据,而无需矢量数据库。
- 保持一切自包含——没有外部数据库,没有嵌入服务,只有XML文件和内存搜索。