裸调LLM_API-Java的HTTP客户端就够

Ollama完整教程:本地LLM管理、WebUI对话、Python/Java客户端API应用 Ollama可以非常方便的管理和部署我们本地大语言模型,老牛同学希望通过本文对Ollama进行一次详细介绍,包括本地大模型管理和使用、WebUI对话界面部署、通过Python和Java使用Ollama的API接口等…… 阅读详情

裸调 LLM API:Java 的 HTTP 客户端就够

框架三行代码就能跑通,报文却从没看清过。哪天框架出问题,日志里全是框架自己的词汇,你连「正确的报文长什么样」都不知道。这篇把框架摘掉,用 JDK 自带的 HttpClient 裸调一次模型接口,tool_use 的原始 JSON 全部见光,工单循环自己转一圈。做过一次裸调,所有框架的文档就都变成了「翻译稿」。

一次裸调的报文往返

调模型接口就是一次普通的 HTTP POST。请求体分三块:model 指定用哪个模型,messages 是对话历史,tools 是工具清单(相当于接口文档)。

{
  "model": "claude-sonnet-4-5",
  "messages": [
    {"role": "user", "content": "北京今天多少度?"}
  ],
  "tools": [
    {
      "name": "get_weather",
      "description": "查询指定城市的当前天气",
      "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"]
      }
    }
  ]
}

响应体里,content 是一个块数组;需要调用工具时,其中会有一块 tool_use,带着工具名和参数。

{
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_01",
      "name": "get_weather",
      "input": {"city": "北京"}
    }
  ],
  "stop_reason": "tool_use"
}

(字段名按主流 API 的公开文档口径整理,Anthropic 的工具定义用 input_schema,其他家叫 parameters,形状相同,核验 2026-10-25。)

模型 API你的 Java 代码模型 API你的 Java 代码你的代码执行 getWeather(北京)POST /messages(messages + tools)content 含 tool_use(要调 get_weather)POST /messages(追加 tool_result)content 是最终文字回答

自己转一圈工单循环

看懂报文之后,循环的四步全是你写过的代码。第一步,发请求。第二步,解析响应,看 stop_reason 是不是 tool_use,是就取出工具名和参数。第三步,执行工具,也就是调用你自己的普通方法。第四步,把结果包成 tool_result 塞进 messages 再发一次请求,直到 stop_reason 不再是 tool_use。
没有框架,循环只有四个 HTTP 动作的厚度。框架替你做的其实是三件事:报文的拼装、循环的托管、各家供应商差异的抹平。

为什么值得裸一次

排查的底牌。框架报错时,你能从框架日志反推「原始报文应该长什么样」,定位是配置错了还是供应商改了字段。

换供应商的基准。裸调一遍 A 家再裸调一遍 B 家,字段差异当场对比,选型不再靠评测软文。

性能的真相。一次工单循环实际是两次以上的 HTTP 往返,延迟的账单在裸调里看得最清楚,这是调优的起点。

亲手跑

下面用一段 Java 拼请求报文、发请求、解析响应。没有配置 AI_API_KEY 时走演示模式,打印报文并解析一份模拟响应,形状和真实响应一致。直接运行 java BareLlmCall.java(JDK 11+)。

// 运行:java BareLlmCall.java
// 裸调一次模型接口。无 AI_API_KEY 时演示模式,打印并解析报文。

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class BareLlmCall {

    static final String REQUEST_BODY = """
            {
              "model": "claude-sonnet-4-5",
              "messages": [
                {"role": "user", "content": "北京今天多少度?"}
              ],
              "tools": [
                {
                  "name": "get_weather",
                  "description": "查询指定城市的当前天气",
                  "input_schema": {
                    "type": "object",
                    "properties": {"city": {"type": "string"}},
                    "required": ["city"]
                  }
                }
              ]
            }
            """;

    static final String MOCK_RESPONSE = """
            {
              "content": [
                {
                  "type": "tool_use",
                  "id": "toolu_01",
                  "name": "get_weather",
                  "input": {"city": "北京"}
                }
              ],
              "stop_reason": "tool_use"
            }
            """;

    public static void main(String[] args) throws Exception {
        String apiKey = System.getenv("AI_API_KEY");
        String response;

        if (apiKey == null) {
            System.out.println("== 演示模式:这就是将要发出的请求体 ==");
            System.out.println(REQUEST_BODY);
            response = MOCK_RESPONSE;
        } else {
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create("https://api.example.com/v1/messages"))
                    .header("x-api-key", apiKey)
                    .header("anthropic-version", "2023-06-01")
                    .header("content-type", "application/json")
                    .POST(HttpRequest.BodyPublishers.ofString(REQUEST_BODY))
                    .build();
            response = HttpClient.newHttpClient()
                    .send(request, HttpResponse.BodyHandlers.ofString())
                    .body();
        }

        System.out.println("== 响应体 ==");
        System.out.println(response);

        // 演示级解析,看懂形状为目的,生产请用 JSON 库
        if (response.contains("\"tool_use\"")) {
            String tool = extract(response, "\"name\":", ",");
            String city = extract(response, "\"city\":", "}");
            System.out.println("循环第二步:发现工单,工具=" + tool.trim()
                    + ",参数 city=" + city.replace("\"", "").trim());
            System.out.println("循环第三步:执行 getWeather(" + city.replace("\"", "").trim() + ")");
            System.out.println("循环第四步:把结果包成 tool_result,追加进 messages 再发一次。");
        } else {
            System.out.println("stop_reason 不是 tool_use,这就是最终回答。");
        }
    }

    static String extract(String body, String key, String endMark) {
        int i = body.indexOf(key);
        if (i < 0) {
            return "?";
        }
        int s = i + key.length();
        int e = body.indexOf(endMark, s);
        return body.substring(s, e > 0 ? e : body.length());
    }
}

记住一句话:框架是翻译稿,报文才是原文,原文只在裸调里见过一次就再也不会忘。

适用边界

这一篇管非流式的最小调用。流式响应的 SSE 报文、各家字段的完整对照表、以及鉴权头的差异(Bearer 与 x-api-key),是另外的题。演示的字符串解析只为看形状,生产代码请用 JSON 库。报文按 2026-10-25 的主流 API 文档口径整理,字段名以你用的供应商为准。跑完把演示模式的报文存下来,它就是你以后排查一切框架问题的对照基准。

基于verilog的16QAM调制 思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差... 阅读详情

相关推荐

Masta调用Geometry Modeller(Space Claim)进行根据三维模型快速建模设置方法

masta中调用ANSYS的space claim的设置方法

xifegnlie的博客 242

Java接入AI能力实战:Spring AI与HTTP裸调选型指南

大模型应用开发中,Java开发者常面临框架选型与集成路径的困惑。从技术原理看,AI能力接入本质是HTTP API调用与SDK封装,核心在于平衡开发效率与架构可控性。合理的技术选型能显著降低维护成本,提升系统稳定性。在智能客服、文档摘要、代码辅助等场景中,Spring AI、LangChain4j等框架与RestTemplate裸调方案各有适用阶段。理解不同方案的抽象层次与依赖关系,结合项目规模与团队储备做决策,才能高效落地AI功能。

weixin_29062671的博客 228

《深入 UFS Explorer:自定义 RAID 配置指南》

UFS Explorer支持以虚拟模式组装任何受支持的RAID配置,以便后续访问其内容或恢复丢失数据。启动RAID构建器;向RAID构建器主内容区域的列表中添加RAID组件;为不可用组件插入占位符(需当前RAID级别支持且软件兼容);调整组件的准确顺序;在“虚拟RAID配置”区域设置RAID参数;以虚拟模式组装阵列各部分。程序主窗口“存储设备导航面板”中打开的任何存储设备(包括驱动器、逻辑卷、磁盘镜像、虚拟磁盘及其他复杂存储设备)均可作为RAID组件。

melonbo的专栏 1404

LangChain4j HTTP 客户端定制:解锁 LLM API 交互的更多可能性

一些 LangChain4j 模块(目前是 OpenAI 和 Ollama)支持自定义用于调用 LLM 提供程序 API 的 HTTP 客户端。SPI,这些模块用它来调用 LLM 提供程序的 REST API。万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更。不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能。「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。关注我,紧跟本系列专栏文章,咱们下篇再续!关注我,紧跟本系列专栏文章,咱们下篇再续!

JavaEdge全是干货的技术号 963

【Claude Code】Claude Code 使用指南

本文介绍了AI编码助手Claude的基础和进阶操作指南。基础部分涵盖启动命令、模式切换(自动编辑/Plan/Yolo模式)、资源监控等核心功能,重点讲解了斜杠命令的使用方法。进阶操作详细说明了CLAUDE.md文件的创建与管理,包括项目规范、代码风格等内容的配置,以及如何通过该文件建立持久上下文。同时提醒了使用过程中的安全风险,建议通过配置文件限制AI对关键代码的访问权限。全文提供了完整的操作指引和安全建议,帮助开发者高效安全地使用Claude进行编码辅助。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 1万+

WPS文档编辑时空行问题解决方案

本文详细介绍了如何解决WPS文档编辑时空行的问题,从问题描述与分析、解决方案详解到操作示例与注意事项等多个方面进行了全面阐述。通过本文的介绍和指导,用户可以快速定位问题根源并采取有效措施进行解决,从而提升文档编辑效率和美观性。未来,随着WPS软件的不断升级和优化,相信会有更多便捷高效的功能被添加到软件中。同时,用户也需要不断学习和探索新的操作技巧和方法,以适应不断变化的办公需求。希望本文能够为广大WPS用户提供有益的参考和帮助,共同推动办公效率的提升和发展。

mmoo_python的博客 1244

Ollama全方位教程:从本地LLM管理到多语言客户端API应用!

在前面有关大模型应用的文章中,多次使用了等),但对这个非常方便管理本地大模型的软件的介绍却很少。目前,清华和智谱 AI 联合发布开源的大模型也能支持进行本地部署了([本地部署 GLM-4-9B 清华智谱开源大模型方法和对话效果体验]),支持的大模型越多越普及,对于的应用也就越多。为了降低大家查阅资料等学习时间,今天尝试着对 Ollama 进行一次详细完整介绍。

2401_84494441的博客 1753

使用VNA(Vector Network Analyzer)对S参数进行去嵌(二)

无论是使用 EM 仿真工具创建的简化模型(如一段理想传输线)还是复杂模型用于测试夹具,现在都需要使用该 S 参数模型执行去嵌入过程。

小孟同学的博客 6108

本地LLM管理、WebUI对话、Python/Java客户端API应用(附教程)

在前面有关大模型应用的文章中,多次使用了Ollama来管理和部署本地大模型(包括:Qwen2、Llama3、Phi3、Gemma2等),但对Ollama这个非常方便管理本地大模型的软件的介绍却很少。

huang9604的博客 1212

软考高级网络规划设计师教程(第3版)

"本书是由工业和信息化部教育与考试中心组织编写的考试用书,依据《网络规划设计师考试大纲》(2026年审定通过)编写。本书分为两篇:第一篇为网络规划与设计综合知识,其中第1章介绍计算机网络基础知识,第2章介绍网络互连与互联网,第3章介绍网络规划与设计的知识和方法,第4章介绍网络资源设备,第5章介绍网络安全技术,第6章介绍标准化和网络安全法规;第二篇为案例实践,其中第7章介绍网络规划案例,第8章介绍网络故障分析与处理案例,第9章介绍网络安全部署案例,第10章介绍网络规划与设计论文写作的指导思想和写作技巧。

鹿鸣天涯 3939

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(1)

海思SS928,SS926以及Hi3519dv500,hi3516dv500下的yolov7模型部署推理系列

Littro Innovations 3084

Ollama部署教程:本地LLM管理、WebUI对话、Python/Java客户端API应用(附教程)

今天尝试着对 Ollama 进行一次详细完整介绍。毕竟也在不断学习中,若有疏漏或者错误之处,还请各位朋友多多指正,谢谢大家。

huang9604的博客 1469

YOLOv8改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 348

Python 是 LLM 时代的母语:从调 API 到工程化工作流

大语言模型应用开发的核心挑战在于将模型输出转化为程序可稳定消费的结构化数据,并实现多步调用的可靠编排。Python 凭借其丰富的生态和动态类型特性,成为 LLM 工作流编排的首选语言。通过 Pydantic 数据校验、指数退避重试、自洽性检查等工程手段,开发者能有效应对模型输出的不确定性,构建可维护的 LLM 应用。从单机脚本到可复用模块,关键在于把 LLM 当成不稳定的组件来设计系统,而非魔法黑盒。

weixin_32667955的博客 222

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LangChain4j-02 核心模型 API 详解:告别裸调 SDK

LangChain4j 核心模型 API 详解 本文深入解析 LangChain4j 的模型层设计,重点介绍两大核心接口: ChatModel(推荐) - 支持多模态输入、工具调用和元数据返回,是官方主推的接口 LanguageModel(维护模式) - 仅支持简单文本生成 文章通过类图展示了 ChatModel 的核心架构,并提供了三种调用方式: 极简文本对话 结构化消息对话(推荐) 自定义请求(高级) 同时演示了如何实现多轮对话,关键在于每次请求时手动维护完整的对话历史。ChatModel 提供了更丰富

manba 504

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Dify 或 LangChain?高手用原生 API 重构 LLM 开发逻辑

框架的本质:成熟周期的产物,而非创新的催化剂我们需要先厘清一个软件工程的常识: 框架(Framework)是为了解决什么问题而诞生的?Spring 诞生是为了解决 Java EE 的繁琐配置;React 诞生是为了解决复杂的 DOM 状态管理。它们的共同点是: 所在的领域已经高度成熟,最佳实践已经固化。此时,框架通过强约束,强行让开发者遵循“标准动作”,从而提高复用率、降低门槛、减少犯错。但在 LLM 领域,情况截然不同。目前的 AI 技术栈还在以“周”为单位迭代。

2301_76168381的博客 874

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LLM - MCP传输协议解读:从SSE的单向奔赴到Streamable HTTP的双向融合

摘要: Model Context Protocol (MCP) 通过优化传输协议提升大模型(LLM)与客户端的交互效率。早期采用SSE(Server-Sent Events)实现单向流式推送,结合HTTP POST实现逻辑双向通信,但面临会话恢复难、长连接资源压力大等痛点。新一代Streamable HTTP通过统一端点、按需流式传输(支持SSE或普通HTTP响应)、引入会话ID(Mcp-Session-Id)实现无状态设计,显著提升兼容性和扩展性,尤其适配云原生架构。其核心改进包括简化协议、增强断线恢复

小工匠 2853

LLM 部署(2)——Ollama 部署大模型

Ollama官网:https://ollama.com/Ollama是一个开源的 LLM(大型语言模型)服务工具,支持的大语言模型列表,可通过搜索模型名称查看:https://ollama.com/library, 官方 GitHub 源代码仓库:https://github.com/ollama/ollama/。在官网首页,可以直接下载Ollama安装程序(支持 Windows/MacOS/Linux):https://ollama.com/安装完成之后常用的系统环境变量参数设置: 删除单个本地大模型:

哦豁灬 2万+

Java LLM开发框架选型与实战:Spring AI与LangChain4j对比

大模型技术正加速进入企业级应用,但Java后端团队在接入时往往面临框架选型与工程落地的双重挑战。不同于Python生态的快速原型,Java项目更注重可维护性、可观测性与生产级治理。Spring AI与LangChain4j作为主流Java LLM开发框架,分别以深度集成Spring Boot和灵活模块化编排见长,支持Prompt模板、结构化输出、RAG检索增强与Agent工具调用等核心能力。理解模型连接抽象、上下文管理与检索链路,是构建可靠AI服务的关键。本文梳理框架差异、核心概念及典型踩坑场景,为后端负责

weixin_33282146的博客 289

Java调用AI模型API:从HTTP请求到流式响应的完整实践

AI模型调用本质上是标准的Web服务交互,核心在于理解HTTP协议、RESTful API设计与JSON数据交换原理。掌握这一底层机制,不仅能规避SDK封装带来的调试盲区和序列化陷阱,更能实现精准的连接管理、超时控制与错误诊断。技术价值体现在可监控、可复现、可扩展的生产级集成能力,广泛应用于AI Agent构建、智能客服、自动化内容生成等场景。本文聚焦Java生态,详解如何通过OkHttp与Gson手写稳定调用DeepSeek等主流大模型API,覆盖同步/流式响应、安全认证、异常处理等关键环节。

weixin_34094282的博客 272

LLM应用HTTP连接池调优:高并发性能黑洞与实战配置

HTTP连接池是管理TCP连接复用的核心机制,通过维护长连接避免频繁握手开销。在LLM应用中,由于请求耗时长、并发密度高,连接池配置不当会导致请求排队、延迟非线性增长。合理设置最大连接数、超时和空闲回收等参数,能显著提升吞吐量并降低P99延迟。典型场景包括对话系统、RAG服务等高频调用外部API的后端。本文深入拆解连接池原理与配置实操,帮助开发者避开性能陷阱。

weixin_33178839的博客 230

LLM开发中API连接失败排查:从客户端配置到生产环境容错

API连接是大型语言模型应用开发的基础技术环节,其工作原理涉及客户端与服务端之间的网络通信协议。在LLM开发实践中,稳定的API连接直接影响项目可靠性和用户体验。从技术价值看,合理的连接管理能显著降低服务中断风险,提升系统鲁棒性。特别是在企业级应用场景中,API连接问题常涉及网络配置、认证参数和服务端状态等多维度因素。本文聚焦Anthropic Claude API和OpenAI API等主流服务,针对常见的unable to connect to anthropic services错误,提供从本地环境调

weixin_34380948的博客 431

Java后端接入大语言模型实战:从HTTP到SSE流式输出

大语言模型(LLM)正快速进入企业级后端系统,其本质是一个远程HTTP智能服务,通过标准REST接口与业务系统交互。对于长期使用Spring Boot等Java技术栈的团队而言,模型集成并非高不可攀,核心在于掌握HTTP通信、流式响应(SSE)、上下文管理、超时重试与安全控制等工程化能力。理解流式机制能显著提升交互体验,让模型输出像打字一样实时反馈;合理的上下文窗口与提示词模板则直接影响回答质量与成本。从裸HTTP调用到Spring AI等框架,Java生态已具备完整实践路径。本文从Java后端工程师视角,

weixin_33483304的博客 307
上一篇: 给Agent写测试-工具调用的回归怎么保
下一篇: Agent的成本账-token计量与预算控制
Deng桑
博客等级 码龄1年 1粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值