人工智能 频道

使用 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 向配置好的聊天模型发送提示词:

@Service
public 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 将文本发送给配置好的嵌入模型:

@Service
public 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

0
相关文章