食品营养搜索工具

一个基于MCP协议和Spring AI的实验性项目,通过自然语言查询法国CIQUAL食品成分数据库,提供食品营养数据的语义搜索功能。

  • by Hellorin
  • Java
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Hellorin/CiqualMcp

使用说明

CiqualMcp

质量:

代码库:

一个同时探索两件事的小型实验项目:

  1. 基于Spring AI的MCP(模型上下文协议) --使用Spring AI的服务器/客户端启动器通过MCP标准公开和使用工具。
  2. 基于人工智能的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 AI ChatClient.
  • 提供REST端点(POST /api/chat)以及用于与营养助理聊天的简单网络UI。
  • 当用户询问食物问题时,LLM会自动调用 searchFood MCP服务器上的工具,用于获取真实的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文件和内存搜索。