当前位置: 首页 > article >正文

零基础学习Spring AI Java AI SpringBoot AI调用大模型OpenAi Ollama集成大模型

零基础学习Spring AI Java AI SpringBoot AI调用大模型OpenAi Ollama集成大模型

环境准备

  • jdk17+ 这里自行安装,我安装的jdk21

  • idea

  • Ollama安装,请参考下面链接:

本地部署大模型,不需要GPU就能玩本地模型-亲测成功

Ollama前端页面调用大模型 知识问答 模型切换

创建项目

maven的pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springai</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springai</name>
    <description>springai</description>

    <properties>
        <java.version>23</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <!--        <dependency>-->
<!--            <groupId>org.springframework.ai</groupId>-->
<!--            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>

</project>

配置ollama大模型调用api地址

其他配置请看官网说明:https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html

spring.application.name=springai

#如果是调用chatGPT的接口,这里配置openai的key,并把maven的配置放开
spring.ai.openai.api-key=34223242432424324

#ollama配置地址
spring.ai.ollama.base-url=http://192.168.1.59:11434
spring.ai.ollama.init.pull-model-strategy=never
spring.ai.ollama.init.timeout=60s
spring.ai.ollama.init.max-retries=1

#ollama配置使用的本地大模型:llama3.1:latest
spring.ai.ollama.chat.options.model=llama3.1:latest
spring.ai.ollama.chat.options.temperature=0.7

spring.ai.ollama.embedding.enabled=true
spring.ai.ollama.embedding.options.model=llama3.1-instruct:latest

使用流式的方式调用时可能会超时报错:Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]

设置超时时间为300秒

package com.example.springai.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        //报错:Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
        configurer.setDefaultTimeout(300000); // 设置超时时间为300秒
    }
}

调用Ollama的API对话

package com.example.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 OllamaController {
    private final OllamaChatModel chatModel;

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

    @GetMapping("/ai/generate")
    public Map<String,String> generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", this.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 this.chatModel.stream(prompt);
    }

}

一次性调用返回效果:
在这里插入图片描述
在这里插入图片描述

流式调用效果:
在这里插入图片描述


http://www.kler.cn/a/380886.html

相关文章:

  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • conda迁移虚拟环境路径
  • StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)
  • 基于STM32的手式电视机遥控器设计
  • Linux下Java的多种方式安装
  • AT89S51/STC89C51开发板教学
  • Node.js 入门指南:从零开始构建全栈应用
  • Vue前端学习笔记03
  • [代码随想录打卡Day7] 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • Modbus通信协议
  • 【C++】RBTree——红黑树
  • MongoDB基础教程
  • leaflet矢量瓦片vetorgrid显示聚合和图标裁剪显示不全的问题
  • Swift 开发教程系列 - 第2章:Swift 基础语法
  • 地理信息科学专业想搞GIS开发:学前端还是后端?
  • 多核架构的基本概念
  • 分布式追踪与告警系统:保障分布式系统稳定运行的利器
  • Jest进阶知识:测试快照 - 确保组件渲染输出正确
  • 学习记录:js算法(八十六):全排列 II
  • 棋牌游戏防ddos攻击,高防IP好用吗?
  • IO流篇(一、File)
  • 承建网站提高访问者留存率
  • 对于IIC的理解
  • Python小白学习教程从入门到入坑------第二十六课 单例模式(语法进阶)
  • 探索Java与C++中的类成员访问修饰符:从默认设置到封装实践
  • 【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)