使用Spring AI对接Ollama搭建自己的智能问答网站

前言

已经是2024年的下半年了,AIGC的应用特别广泛,不仅好玩儿也很实用,之前有使用过RWKV做过一个智能问答网站,但那时Spring AI还不是很流行。

现在Spring AI已经比较成熟了,想体验一下Spring AI到底是啥样的,并且由于Open AI在国内的限制,看了看Spring AI所支持的模型,选择了可本地运行的Ollama模型

开始

环境

在开始前需要确定开发环境,我的开发环境如下:

软件版本
JDK17.0.11 2024-04-16 LTS,下载地址
Maven3.8.8下载地址
IntelliJ IDEAIntelliJ IDEA 2024.1.4 (Ultimate Edition),下载地址
Ollama0.2.5下载地址

Ollama

参考Ollama全面指南:安装、使用与高级定制.

Windows安装步骤:

  1. Ollama下载页下载安装程序,执行安装程序,默认会安装到C:\Users\{Windows账户名}\AppData\Local\Programs\Ollama下。

  2. 如果不想下载的模型安装到C盘,可以通过设置OLLAMA_MODELS环境变量更改模型下载路径,我的变量值为E:\LM\ollama,设置好后记得重启Ollama。

  3. 安装完成后使用ollama -v查看是否安装成功,如果没有运行模型则输出信息大致如下:

    1
    2
    Warning: could not connect to a running Ollama instance
    Warning: client version is 0.2.5

运行一个模型:

可以到library | Ollama查看你的电脑适合的模型,这里我选择通义千问0.5b模型

打开cmd,键入以下命令下载并运行模型:

1
ollama run qwen:0.5b

模型运行成功后等待输入,我们可以让它介绍一下自己,终端完整执行过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\Users\makun>ollama run qwen:0.5b
pulling manifest
pulling fad2a06e4cc7... 100% ▕████████████████████████████████████████████████████████▏ 394 MB
pulling 41c2cf8c272f... 100% ▕████████████████████████████████████████████████████████▏ 7.3 KB
pulling 1da0581fd4ce... 100% ▕████████████████████████████████████████████████████████▏ 130 B
pulling f02dd72bb242... 100% ▕████████████████████████████████████████████████████████▏ 59 B
pulling ea0a531a015b... 100% ▕████████████████████████████████████████████████████████▏ 485 B
verifying sha256 digest
writing manifest
removing any unused layers
success
>>> 请介绍一下你自己
我是来自阿里云的大规模语言模型,我叫通义千问。作为一个AI助手,我的目标是帮助用户获取准确、有用的信息,解决他们的问题
和困惑。我会不断地学习新的知识和技能,不断提高自己的能力和效率,更好地服务于用户。

>>> Send a message (/? for help)

如果不想聊天,想关闭模型,输入聊天内容/bye即可,其他聊天命令可以使用/?进行查看。

其他说明:如果Ollama模型被其他程序启动了,没有关闭,再用其他程序调用Ollama模型的话,可能出现异常(没有响应),可以到Windows任务栏的隐藏图标托盘^右键Ollama,Quit Ollama即可。

Spring AI

可以参考Spring AI - Spring 中文创建Spring AI项目。

创建步骤:

  1. 直接使用IDEA的Spring Initializr(即创建Project时的Spring Boot)引导,快速创建Spring AI项目。

    1. 项目参数(按需参考):

      参数名参数值
      Namespring-ai-demo
      Location~\Desktop\temp\project-demo
      LanguageJava
      TypeMaven
      Groupcn.insectmk.demo
      Artifactspring-ai-demo
      Package Namecn.insectmk.demo.springaidemo
      JDK17
      Java17
      PackagingJar
    2. 项目依赖(按需参考):

      Spring Boot:3.3.2

      Dependencies:Web - Spring WebAI - Ollama

  2. 参考Ollama聊天::Spring AI参考-Spring中文,编写@Controller类,案例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package cn.insectmk.demo.springai.controller;

    import org.springframework.ai.chat.messages.UserMessage;
    import org.springframework.ai.chat.model.ChatResponse;
    import org.springframework.ai.chat.prompt.Prompt;
    import org.springframework.ai.ollama.OllamaChatModel;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    import java.util.Map;

    @RestController
    public class ChatController {

    private final OllamaChatModel chatModel;

    @Autowired
    public ChatController(OllamaChatModel chatModel) {
    this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
    return Map.of("generation", chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
    public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
    Prompt prompt = new Prompt(new UserMessage(message));
    return chatModel.stream(prompt);
    }

    }

  3. 编写src/main/resources/application.properties,加入以下内容配置Ollama模型的内容:

    1
    2
    spring.ai.ollama.base-url=http://localhost:11434
    spring.ai.ollama.chat.model=qwen:0.5b

运行

执行以下步骤以启动程序:

  1. 先将Ollama关闭:Windows任务栏右侧隐藏托盘 -> Ollama(羊驼图标)-> 鼠标右键 -> Quit Ollama
  2. 打开cmd终端,键入ollama run qwen:0.5b以启动通义千问0.5b模型
  3. IDEA运行项目启动类

测试:

  1. 访问http://localhost:8080/ai/generate以测试对话.

    当然,你也可以自定义问题参数,使用案例如:http://localhost:8080/ai/generate?message=给我讲个笑话

  2. 访问http://localhost:8080/ai/generateStream以测试流式对话

    同上,使用案例如:http://localhost:8080/ai/generateStream?message=给我讲个笑话

后语

好了,现在你已经学会如何让你的Java程序对接AIGC了,快去升级你的程序吧!

参考文章

Spring AI - Spring 中文

Ollama官方仓库

Ollama全面指南:安装、使用与高级定制

Ollama聊天::Spring AI参考-Spring中文