使用 LM Studio 将本地大型语言模型与 Spring AI 集成
1. 概述
大型语言模型(LLM)已成为现代应用程序的关键组成部分。虽然功能最强大的模型属于专有模型,且托管在云环境中,但访问这些模型需要互联网连接,并需将应用程序数据发送给外部提供商。
对于处理涉及隐私的敏感信息或需要离线运行的应用程序而言,这些要求可能难以接受。因此,将本地 LLM 集成到应用程序中的需求日益增长。
在本教程中,我们将学习如何将 Spring AI 与 LM Studio 集成,并配置 Spring AI 使其与本地托管的聊天模型和嵌入模型进行通信。
2. LM Studio
LM Studio 是一款可在本地环境中下载、管理和托管大语言模型(LLMs)及嵌入式模型的应用程序。其图形化界面使我们能够轻松浏览并从公共仓库下载模型:
除了模型管理功能外,它还提供了一个 API 服务器,通过基于 REST 的 API 公开已加载的模型。这使得 Spring AI 等 AI 框架能够与本地模型进行交互。
还有其他应用程序(如 Ollama)提供了类似的功能,但侧重点不同:
总体而言,LM Studio 为探索和尝试本地模型提供了更友好的用户体验,而 Ollama 则针对命令行工作流进行了优化。
3. Maven 依赖项
LM Studio 同时提供了兼容 OpenAI 和兼容 Anthropic 的 API 端点。
要与 Spring AI 集成,我们可以选择 Spring AI OpenAI 依赖项或 Spring AI Anthropic 依赖项。但是,Spring AI Anthropic 不支持嵌入模型。
因此,本教程将采用 Spring AI OpenAI 依赖项:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> <version>2.0.0</version></dependency> |
请注意,Spring AI 2.0.0 基于 Spring Framework 7 构建,并专为 Spring Boot 4 设计。
4. 配置
让我们配置 application.yml 文件,以采用 LM Studio 中的本地模型:
spring: ai: openai: api-key: dummy base-url: http://localhost:1234/v1 chat: model: google/gemma-4-e4b embedding: model: text-embedding-embeddinggemma-300m |
有几个属性值得特别说明:
api-key:连接本地模型时,实际上并不需要真实的 API 密钥。因此,只需填写任意值即可。
base-url:在 LM Studio 中启动本地服务器时,可以查看到基础 URL。如果使用 Spring AI OpenAI 依赖项,请记得在基础 URL 后附加 /v1。
model:仅当 LM Studio 中加载了多个模型时,才需要指定模型。否则,可以省略此模型配置。
5. 示例端点
现在,让我们创建两个端点:一个用于聊天模型,另一个用于嵌入模型。
控制器基本上将工作委托给两个与模型配合使用的服务:
@RequestMapping("/lm-studio")public class LmStudioController { private final ChatService chatService; private final EmbeddingService embeddingService; public LmStudioController(ChatService chatService, EmbeddingService embeddingService) { this.chatService = chatService; this.embeddingService = embeddingService; } @PostMapping("/chat") @ResponseStatus(HttpStatus.OK) public String chat(@RequestBody String prompt) { return chatService.chat(prompt); } @PostMapping("/embeddings") @ResponseStatus(HttpStatus.OK) public EmbeddingResponse getEmbeddings(@RequestBody String text) { return embeddingService.getEmbeddings(text); }} |
ChatService 使用 ChatClient 向配置好的聊天模型发送提示词:
@Servicepublic class ChatService { private final ChatClient chatClient; public ChatService(ChatClient.Builder builder) { this.chatClient = builder.build(); } public String chat(String prompt) { return chatClient.prompt() .user(userMessage -> userMessage.text(prompt)) .call() .content(); }} |
同样,EmbeddingService 将文本发送给配置好的嵌入模型:
@Servicepublic class EmbeddingService { private final EmbeddingModel embeddingModel; public EmbeddingService(EmbeddingModel embeddingModel) { this.embeddingModel = embeddingModel; } public EmbeddingResponse getEmbeddings(String text) { EmbeddingRequest request = new EmbeddingRequest(List.of(text), null); return embeddingModel.call(request); }} |
6. 测试运行
在启动 Spring Boot 应用程序之前,请确保 LM Studio 本地服务器正在运行,并且已加载聊天模型和嵌入模型:
现在,让我们通过 curl 发起 HTTP 请求,验证聊天和嵌入两个端点。
首先,我们向聊天端点发送一个请求:
curl -X POST http://localhost:8080/lm-studio/chat -d "Tell me who you are" |
该请求由当前在 LM Studio 中加载的聊天模型处理。在此示例中,我们加载了 Google 的 Gemma 4 模型,因此该端点返回以下响应:
I am Gemma 4, a Large Language Model developed by Google DeepMind. |
接下来,我们将聊天模型的响应作为请求负载发送至嵌入式端点:
curl -X POST http://localhost:8080/lm-studio/embeddings -d "I am Gemma 4, a Large Language Model developed by Google DeepMind." |
该端点返回了嵌入式响应。由于完整响应体积较大,我们仅展示模型名称和前几个元素:
{ "metadata": { "model": "text-embedding-embeddinggemma-300m:2" }, "result": { "index": 0, "output": [ -0.07699633, -0.030751443, 0.019093497, ... ] }} |
这些结果证实,Spring AI 已通过 LM Studio 的 OpenAI 兼容 API 成功调用了本地托管的聊天模型和嵌入式模型。
7. 结论
在本文中,我们学习了如何将 Spring AI 与 LM Studio 集成,以使用本地托管的聊天模型和嵌入式模型。我们配置了 Spring AI,使其能够通过 LM Studio 的 OpenAI 兼容 API 与开源模型协同工作。
对于无需依赖云服务提供商即可运行 AI 模型的情况,LM Studio 是一个绝 佳的选择。这种方法将数据保留在本地环境中,并支持在无网络连接的情况下运行。这些特性使其非常适合对隐私要求较高的应用场景。
一如既往,完整的代码示例可在 GitHub 上获取。
作者:Manfred Ng;审校:Michal Aibin



