首页 > 其他分享 >spring boot 以请求来调用Ollama大模型,不使用spring ai

spring boot 以请求来调用Ollama大模型,不使用spring ai

时间:2024-08-30 11:38:09浏览次数:4  
标签:String ai spring boot private url json new import

  之前有一版使用spring ai的,但是其实Ollama有一套api可以直接调用。api地址是https://github.com/ollama/ollama/blob/main/docs/api.md

  我们聊天其实调用的就是这个(其余的我就不赘述了,大家自行研究)

    调用http请求这方面,大家可自行编写,请求的方式五花八门,网上的库和组件都比较完善了。我就简单的分享一个本人的。

   1、引用配置 (yam文件不变)

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20240303</version>
        </dependency>

   2、编写实体类

import lombok.Data;

@Data
public class Message {
    private String content;

    private String role;
}

  role偷懒没做枚举类,ollama有4种,大家自己查阅。我这就是简单的主体。

import lombok.Data;
import java.util.List;

@Data
public class ChatRequestParam {

    private String model;

    private Boolean Stream;

    private List<Message> messages;
}

  3、http请求类

import okhttp3.CookieJar;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class HttpClient {

    private final Logger logger = LoggerFactory.getLogger(HttpClient.class);

    private OkHttpClient createClient() {
        return new OkHttpClient().newBuilder()
                .callTimeout(1, TimeUnit.MINUTES)
                .cookieJar(CookieJar.NO_COOKIES)
                .build();
    }

    public String post(String url, String json) {
        OkHttpClient client = createClient();
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(json, MediaType.get("application/json")))
                .build();
        Call call = client.newCall(request);
        logger.info("开始请求了");
        try {
            Response response = call.execute();
            String result = response.body().string();
            logger.info("请求结束,请求结果:{}", result);
            return result;
        } catch (Exception e) {
            logger.error("sorry,异常了:{}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    public Response get(String url, String json) throws IOException {
        OkHttpClient client = createClient();
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        request.newBuilder().setBody$okhttp(RequestBody.create(json, MediaType.get("application/json")));
        Call call = client.newCall(request);
        return call.execute();
    }
}

  4、请求类

@RestController
public class AnotherChatController {

    @Value("${spring.ai.ollama.base-url}")
    private String url;

    @Value("${spring.ai.ollama.chat.options.model}")
    private String model;

    private static final String chatApi = "/api/chat";

    @GetMapping("/ai/chat")
    public String chat(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) throws IOException {
        HttpClient httpClient = new HttpClient();
        String response = httpClient.post(url + chatApi, buildMainContent(message));
        return response;
    }

    private String buildMainContent (String msg) {
        ChatRequestParam chatRequestParam = new ChatRequestParam();
        chatRequestParam.setModel(model);
        chatRequestParam.setStream(false);
        Message target = new Message();
        target.setContent(msg);
        target.setRole("user");
        chatRequestParam.setMessages(List.of(target));
        return new JSONObject(chatRequestParam).toString();
    }
}

  注意,结果里面的response.body().string() 只能调用一次,调用完就销毁了,所以我们得存起来,不能反复引用。至此,完毕!

    

标签:String,ai,spring,boot,private,url,json,new,import
From: https://www.cnblogs.com/lannoy/p/18387097

相关文章

  • @Import注解 -【Spring底层原理】
    通过在配置类上使用@Import注解,将User给注入进容器中,运行启动类,可以看到容器中有User对象:image-20210226164625069【2】导入ImportSelector的实现类导入ImportSelector的实现类需要实现ImportSelector类,自定义逻辑返回需要导入的组件,返回的字符串数组即是要注入的组件,添加修改......
  • AI大模型专题:2023大模型落地应用案例集
    概述私域知识问答系统是一种旨在满足特定组织或团队内部需求的智能信息获取工具。其产品形式包括:知识问答、企业助理、办公助手、智能客服、数字员工等。岩芯数通过自研构建可控可信的通用大模型,缓解了行业中大模型幻觉问题,提升型的准问答能力,回答准确率达到90%,目前已在......
  • SpringBoot记录日志
    @Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{//自定义操作日志记录注解publicStringtitle();//模块名称publicOperatorTypeoperatorType()defaultOperatorType.MAN......
  • 免费试听 | AI自动化副业创收班手把手带你提升副业收益
    副业创收已经成为行业趋势,在当前经济形势下,许多人面临着行业裁员的不确定性。为了增强个人的抗风险能力,寻求一份副业已经成为一种重要的趋势。这不仅是经济上的补充,更是对自由与独立的一种追求——它应让你自主掌控,不被外界束缚。通过精心打造的副业,你不仅可以灵活安排时间,享受到工......
  • LOTO示波器统计曲线和故障分析pass/fail测试
    LOTO示波器统计曲线和故障分析pass/fail测试虚拟示波器可以应用在工业自动化检测中,除了常规的检测波形和测量值参数以外,由多个行业客户定制和验证的统计曲线和故障分析(pass/fail)功能也为工业自动化检测带来极大的便利。     (一)故障分析(pass/fail)的基础:统计曲线功能在信号......
  • spring boot 根据实体类生成表
    在开发的过程中,经常会遇到数据库表结构发生变化或者新增表的情况,而spring体系下提供的springdatajpa可以帮助我们很方便的处理这种情况,只需要简单的配置既可!以下便是实现路径以及其中需要注意的事项。添加依赖<dependency><groupId>org.springframework.boo......
  • 短视频创作神器:AI助手帮你一键生成脚本草稿
    本文由ChatMoney团队出品在当今这个快节奏的数字时代,短视频以其短小精悍、内容丰富的特点迅速崛起,成为大众娱乐和信息传播的重要载体。然而,对于许多创作者而言,如何构思一个引人入胜、富有创意的脚本,往往是他们面临的第一个挑战。近期发下ChatMoneyAI的全能AI知识库系统短视频......
  • 基于SpringBoot的大学生就业需求分析系统设计与实现
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • Spring框架中如何实现国际化(i18n)?
    在Spring框架中实现国际化(i18n)主要涉及以下几个步骤:1.准备资源文件首先,你需要为不同语言准备资源文件。这些资源文件通常放在类路径下的特定目录中,如src/main/resources/下的messages.properties文件。对于不同的语言和地区,你可以创建对应的.properties文件,例如me......
  • 【AI绘画】Midjourney前置指令/blend、/info、/subscribe详解
    文章目录......