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

Java自定义程序使用Ollama实现本地ai调用

Ollama 提供 两套核心接口三种常见输入风格两种输出模式,你可以按需组合。


一、两套核心接口

  1. /api/generate
    • 一问一答,无对话历史
    • 输入:单次 prompt,可选参数(temperature、top_p、max_tokens …)。
    • 输出:单个 JSON(或 SSE 流式 JSON 行)。

  2. /api/chat(推荐做多轮)
    • 支持多轮对话,带 messages 数组。
    • 输入:

    {"model": "deepseek-r1:7b","messages": [{"role": "system", "content": "你是助手"},{"role": "user",   "content": "今天几号"},{"role": "assistant", "content": "今天是..."},{"role": "user",   "content": "明天呢"}]
    }

    • 输出:结构同 /api/generate,但多了 message.rolemessage.content 字段。


二、三种常见输入写法

  1. JSON 字符串(最原始)

    String json = "{\n \"model\": \"deepseek-r1:7b\",\n \"prompt\": \"你好\"\n}";
  2. Map/Object → JSON(用 Jackson/Gson 省掉拼接

    var body = Map.of("model", "deepseek-r1:7b","prompt", "你好","options", Map.of("temperature", 0.7)
    );
    String json = new ObjectMapper().writeValueAsString(body);
  3. 流式(SSE)输入
    "stream": true 即可,后面用 readLine() 逐条解析。


三、两种输出模式

  1. 一次性("stream": false

    {"model":"...","response":"今天...","done":true}
  2. 流式("stream": true) 服务器返回 多行 JSON:

    {"model":"...","response":"今"}
    {"model":"...","response":"天"}
    {"model":"...","response":"是","done":false}
    ...
    {"model":"...","response":"","done":true}

    前端/终端可边收边渲染,体验更像 ChatGPT。


四、常用可选字段速查

字段作用示例
temperature0~1,越大越“放飞”
top_p0~1,核采样阈值
max_tokens限制输出长度
num_ctx上下文窗口大小(默认 2048)
keep_alive模型驻留时间,如 "5m""1h"
format"json" 强制返回 JSON 结构(需模型支持)

一句话总结

  • /api/generate 单轮;/api/chat 多轮。

  • 输入可以是简单 prompt,也可以是带 system/user/assistant 的 messages。

  • 输出可选一次性 JSON 或 SSE 流式 JSON。
    根据业务场景自由组合即可。

一次性输出:

U28/Ollama.java · 伏琪/java基础语法练习 - 码云 - 开源中国https://gitee.com/fuqiqiqi/test/blob/master/U28/Ollama.java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class Ollama {public static void main(String[] args) throws Exception {// 传统写法:用转义 + 换行String json = "{\n" +"  \"model\": \"deepseek-r1:7b\",\n" +"  \"prompt\": \"你知道今天是几月几号吗\",\n" +"  \"stream\": false\n" +"}";HttpRequest req = HttpRequest.newBuilder().uri(URI.create("http://localhost:11434/api/generate")).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(json)).build();HttpClient client = HttpClient.newHttpClient();HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());System.out.println(resp.body());}
}

    


流式输出:

U28/ChatStreamPure.java · 伏琪/java基础语法练习 - 码云 - 开源中国https://gitee.com/fuqiqiqi/test/blob/master/U28/ChatStreamPure.java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class ChatStreamPure {private static final String URL = "http://localhost:11434/api/generate";private static final HttpClient CLIENT = HttpClient.newHttpClient();public static void main(String[] args) throws Exception {Scanner in = new Scanner(System.in);while (true) {System.out.print("\n你: ");String user = in.nextLine().strip();if ("bye".equalsIgnoreCase(user)) break;// 手写 JSONString json = String.format("{\"model\":\"deepseek-r1:7b\",\"prompt\":\"%s\",\"stream\":true}",escapeJson(user));HttpRequest req = HttpRequest.newBuilder().uri(URI.create(URL)).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8)).build();// 直接拿到 InputStream 逐行读HttpResponse<java.io.InputStream> resp =CLIENT.send(req, HttpResponse.BodyHandlers.ofInputStream());try (BufferedReader br = new BufferedReader(new InputStreamReader(resp.body(), StandardCharsets.UTF_8))) {br.lines().filter(line -> !line.isBlank()).forEach(line -> {int start = line.indexOf("\"response\":");if (start == -1) return;start += 12;char quote = line.charAt(start - 1);int end = line.indexOf(quote, start);if (end == -1) return;String token = line.substring(start, end).replace("\\n", "\n").replace("\\\"", "\"");System.out.print(token);});}System.out.println();}System.out.println("再见!");}private static String escapeJson(String s) {return s.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n");}
}

  


        我是伏琪,关注订阅号伏琪了解更多。 

http://www.dtcms.com/a/354937.html

相关文章:

  • Java-反射机制
  • Java 多线程环境下的全局变量缓存实践指南
  • PyTorch 张量核心知识点
  • 【物联网】什么是 Arduino Nano 33 IoT?
  • 基于springboot的二手车交易系统
  • WEEX唯客上线C2C交易平台:打造安全便捷的用户交易体验
  • FISCO-BCOS-Python 模板
  • 上海控安:GB 44495-2024《汽车整车信息安全技术要求》标准解读和测试方案
  • 动手学深度学习(pytorch版):第七章节—现代卷积神经网络(6)残差网络(ResNet)
  • Ubuntu 使用百度云的bypy上传和下载数据
  • ArcGIS+Fragstats:土地利用统计分析、景观格局指数计算与地图制图
  • 终极实战 - 全链路排查一次“502 Bad Gateway”
  • Linux并发与竞争
  • 达梦数据库-重做日志文件(三)-自动化迁移脚本和检查 磁盘 I/O 性能建议
  • 详细介绍Linux 内存管理 匿名页面和page cache页面有什么区别?
  • Mybatis 与 Springboot 集成过程详解
  • vue有哪些优缺点
  • 前端实现Linux查询平台:打造高效运维工作流
  • 从图卷积网络(GCN)到简化图卷积网络(SGC)的对话
  • RAG系统深度优化全攻略:从理论到实践的高性能实现
  • 【C语言16天强化训练】从基础入门到进阶:Day 14
  • NVFP4量化技术深度解析:4位精度下实现2.3倍推理加速
  • 内网对抗-红日靶场4通关详解
  • 财务数据报销画像技术实现:从数据采集到智能决策的全流程解析
  • 2025docker快速部署Nginx UI可视化管理平台
  • Unity3d使用SerialPortUtilityPro读取串口数据
  • Linux(一) | 初识Linux与目录管理基础命令掌握
  • Libvio 访问异常排查指南
  • 2021/07 JLPT听力原文 问题一 2番
  • 【python】@staticmethod装饰器