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

news/2024/10/6 18:28:14

  之前有一版使用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() 只能调用一次,调用完就销毁了,所以我们得存起来,不能反复引用。至此,完毕!

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/54601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

pg14+etcd+Patroni 高可用配置流程

pg14+etcd+Patroni 高可用配置流程 目录pg14+etcd+Patroni 高可用配置流程基础配置IP 规划:修改超级用户密码:在主库上创建流复制用户修改 pg_hba 文件备库重新创建数据目录:开启watchdog创建.pgpass生成备库在备库修改同步信息备库查看主库查看同步信息安装etcd下载etcd安装…

vmware Docker 设置代理

vmware Docker 设置代理到宿主机的代理软件 vim /usr/lib/systemd/system/docker.service添加配置 在[Service]处添加以下两行信息,将流量代理给宿主机的7890端口出外网,ip换成你自己的,配置成虚拟机的网关地址 Environment="HTTP_PROXY=http://192.168.31.1:7890"…

解决rancher部署k8s集群问题

一.问题概述 国内网络使用docker部署,local集群会报错,并在创建rke2自定义集群时不成功,会卡住;二.问题分析 这个问题主要是由于在使用docker run命令启动Rancher容器时,错误地映射了数据目录/var/lib/rancher到宿主机所导致的。下面是详细的问题分析和解决方案整理: 1.内…

使用 nuxi build 命令构建你的 Nuxt 应用程序

title: 使用 nuxi build 命令构建你的 Nuxt 应用程序 date: 2024/8/30 updated: 2024/8/30 author: cmdragon excerpt: nuxi build 命令是构建 Nuxt 应用程序的核心工具,它将你的应用程序打包成适合生产环境的格式。通过理解和使用不同的选项,如 --prerender、--dotenv 和 …

哈萨克语学习心得(一)——哈萨克语西里尔字母记忆法

最近开始学习基于西里尔文字的哈萨克语,慢慢梳理一下自己的学习心得。 首先是字母的学习,虽然之前没有接触过西里尔文字,但是感觉自己在记忆字母这方面没什么太大的障碍,可能是因为西里尔字母来源于希腊字母吧,而之前数学和物理课上学到了很多希腊字母的发音,跟西里尔字母…

dp安装包升级步骤

1、jekens获取包 2、解压包 包上传到服务器解压/root目录,空间大于6G3、进入到解压目录4、升级 mstsc -v 47.100.179.150:8219

世微 AP9195 7-24V 大功率升压恒流驱动芯片 LED照明与控制器方案

概述 AP9195 是一款高效率、高精度的升 压型大功率 LED 灯恒流驱动控制芯片。 AP9195 内置高精度误差放大器,固 定关断时间控制电路,恒流驱动电路等, 特别适合大功率、多个高亮度 LED 灯串的 恒流驱动。 AP9195 通过调节外置的电流采样电 阻,能控制高亮度 LED 灯的驱动电流…

redis-shake4迁移数据(蛮好用)

redis-shake下载地址:https://github.com/tair-opensource/RedisShake/releases 测试环境redis需要从公有云迁移到私有云,就用redis-share测试一下。 下载后解压(就两个文件,执行文件和配置文件): [root@gcv-x-test-sharedb-oracle redis]# cat shake.toml ##我只需要复制…