为什么需要让 AI 听懂 REST API

发布时间:2026/10/30 13:02:21

为什么需要让 AI 听懂 REST API 在过去两年里我和团队接手了好几个「上了年纪」的 Java 项目。这些系统有一个共同特征业务逻辑完整API 齐全Swagger 文档也写得规规矩矩但前端换了一波人文档却没人维护了。新来的同事要查一个订单接口得翻好几个 YAML 文件再对着代码比对字段名。更要命的是当我们打算在这些系统上引入 AI 能力时遇到了一个非常实际的矛盾——LLM 不理解 REST API。大语言模型固然强大但它在推理时无法凭空知道你的订单系统有哪些接口、每个接口的入参是什么、响应结构长什么样。让它去查询订单状态它可能会胡编一个接口路径出来。传统做法是为每个接口写工具函数Tool注册到 Agent 里。这个思路没错但当你面对一个拥有上百个 REST 端点的系统时一个一个写 Tool 注册——成本太高了。Solon AI Harness 的 addApiServer 就是为了解决这个问题而生的。它能从 OpenAPISwagger描述文件或文档 URL 中自动读取 API 定义自动为每个端点生成 Tool 签名Agent 直接通过自然语言调用。零代码让大模型听懂你的 REST API。这篇文章我会用一个完整的订单系统场景带你从头把 OpenAPI 接入 Harness。读完你就能在自己的项目里用起来。场景描述——一个遗留订单系统的窘境假设我们有一个典型的电商订单系统叫 order-service。它暴露了大概二十几个 REST 接口涵盖订单 CRUD、库存查询、物流跟踪、售后处理等模块。这个系统有几样「遗产」接口文档存在一个内网地址 http://internal-api-doc/order-service/v3/api-docs基于 OpenAPI 3.0代码没有全部迁移到微服务部分逻辑还是单体团队想引入 AI 助手但没人力给每个接口写 Agent Tool这个窘境在不少 Java 项目里都出现过——API 定义得很规范但 AI/LLM 不认识它们。我们需要做的是把 Harness 引擎架设在系统前面告诉它「这是一份 OpenAPI 文档」然后 Agent 就能听懂「帮我查一下订单 20250320001 的物流状态」这样的自然语言请求。添加依赖第一步在 pom.xml 中加入 Solon AI Harness 的核心依赖。org.noear solon-ai-harness ${solon.version} 这里 ${solon.version} 请替换成你项目实际使用的 Solon 版本建议使用 v4.0.2 以上。Harness 本身依赖了 LLM 调用层、Agent 会话管理和 Tool 调度框架不需要额外引入其他库。实现——用 addApiServer 构建 AI 引擎构建 HarnessEngineHarness 的入口是 HarnessEngine我们需要给它配置三样东西模型Agent 背后的大脑负责理解用户意图并决定调用哪个工具工作目录Harness 存放会话和缓存的工作区API 源告诉 Harness 你的 OpenAPI 文档在哪直接看代码import org.noear.solon.ai.harness.HarnessEngine;import org.noear.solon.ai.harness.permission.ToolPermission;import org.noear.solon.ai.chat.ChatConfig;import org.noear.solon.ai.agent.session.AgentSessionProvider;import org.noear.solon.ai.agent.session.InMemoryAgentSession;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class OrderAiEngine {public static HarnessEngine create() { // 会话提供者 AgentSessionProvider sessionProvider new AgentSessionProvider() { private final MapString, AgentSession sessionMap new ConcurrentHashMap(); Override public AgentSession getSession(String instanceId) { return sessionMap.computeIfAbsent( instanceId, k - InMemoryAgentSession.of(k) ); } }; // 构建引擎 HarnessEngine engine HarnessEngine.of(work, ./harness-home) .systemPrompt(你是一个订单系统 AI 助手。 你可以查询订单、查询库存、跟踪物流、处理售后。 使用 OpenAPI 工具时按照文档说明传递参数。 如果用户意图不明确主动追问确认。) .sessionProvider(sessionProvider) .modelAdd(new ChatConfig().then(slf - { slf.setApiUrl(https://api.openai.com/v1); slf.setApiKey(sk-xxxxxx); slf.setModel(gpt-4o-mini); })) .sandboxEnabled(true); return engine; }}几个关键点HarnessEngine.of(workspace, harnessHome) 需要两个目录参数workspace 定位工作目录harnessHome 放配置和框架产物systemPrompt 用来约束 Agent 行为会注入到每次对话的系统消息中生产环境建议开启 sandboxEnabled(true)避免 Agent 执行危险操作接入 OpenAPI——addApiServer 的核心用法现在是最关键的一步让 Harness 理解你的 REST API。import org.noear.solon.ai.harness.source.ApiSource;// 在引擎上注册 OpenAPI 源engine.addApiServer(new ApiSource().then(s - {s.setDocUrl(“http://internal-api-doc/order-service/v3/api-docs”);s.setApiBaseUrl(“http://order-service.internal:8080”);}));就这么简单。ApiSource 通过 setDocUrl 指定 OpenAPI 文档地址setApiBaseUrl 指定实际调用的 Base URL。Harness 会自动做以下几件事拉取 OpenAPI 文档支持 JSON 和 YAML兼容 OpenAPI 3.0 / 3.1 / Swagger 2.0解析每个路径、方法、参数、请求体和响应结构自动生成对应的 Tool 描述和参数签名注册到 Agent 的可用工具列表整个过程完全不需要你写一行工具代码。二十个接口如此两百个接口也是如此。完整的引擎初始化public static HarnessEngine createEngine() {AgentSessionProvider sessionProvider new AgentSessionProvider() {private final MapString, AgentSession sessionMap new ConcurrentHashMap();Overridepublic AgentSession getSession(String instanceId) {return sessionMap.computeIfAbsent(instanceId, k - InMemoryAgentSession.of(k));}};HarnessEngine engine HarnessEngine.of(work, ./harness-home) .systemPrompt(你是一个订单系统 AI 助手。 你可以查询订单、查询库存、跟踪物流。 始终使用 OpenAPI 工具获取实时数据。 如果参数不完整询问用户补充。) .sessionProvider(sessionProvider) .modelAdd(new ChatConfig().then(slf - { slf.setApiUrl(https://api.openai.com/v1); slf.setApiKey(sk-xxxxxx); slf.setModel(gpt-4o-mini); })) .sandboxEnabled(true) .memoryEnabled(true) .maxTurns(10) .compressionThreshold(30, 30_000) .addApiServer(new ApiSource().then(s - { s.setDocUrl(http://internal-api-doc/order-service/v3/api-docs); s.setApiBaseUrl(http://order-service.internal:8080); })); return engine;}memoryEnabled(true)Agent 在多轮对话中记住上下文maxTurns(10)限制对话最大轮次compressionThreshold(30, 30_000)超过 30 条消息或 30000 token 时自动压缩实战——用自然语言查询订单和库存引擎搭好了来看实际对话效果。场景一查订单public void demoQueryOrder() {HarnessEngine engine createEngine();String question “帮我查一下订单 20250320001 的物流状态看看今天能不能到。”;var result engine.prompt(question).call();System.out.println(result.getContent());}引擎收到这个 prompt 后内部工作流程如下大模型判断意图属于「查询订单物流」从 OpenAPI 生成的 Tool 列表中选中对应的 GET /api/orders/{orderId}/logisticsLLM 自动提取参数 orderId “20250320001”Harness 组装 HTTP 请求拿到响应 JSON 后LLM 把结构化数据转成自然语言回答输出类似订单 20250320001 的物流状态如下承运方顺丰速运运单号SF1234567890当前状态运输中最新节点2025-03-20 14:30已到达【上海市浦东新区分拨中心】预计送达今天3月21日18:00 前目前看今天能到建议您保持电话畅通。场景二查库存 组合意图String question “SKU 88002 还有库存吗如果缺货的话什么时候能补上”;var result engine.prompt(question).call();Harness 会自动判断需要调用 GET /api/inventory/{sku} 这个接口。如果 OpenAPI 中还有一个补货计划接口初次查询发现库存为 0LLM 会主动发起第二次工具调用查询补货计划然后整合给出回答。SKU 88002商品极简蓝牙耳机当前库存为 0。根据补货计划下一批预计在 3 月 25 日到货数量 500 件。建议您开启到货提醒。LLM 不是一次把所有工具都调一遍而是根据上下文的实际需要动态决定调用顺序。场景三多轮会话public void demoMultiTurn() {HarnessEngine engine createEngine();AgentSession session engine.getSession(“order-002”);var r1 engine.prompt(帮我查一下订单 20250320001
延伸阅读

更多相关文章

2026/10/29 15:08:00

英伟达到昇腾训练迁移:并行配置等问题

英伟达到昇腾训练迁移:并行配置、通信与算子兼容问题合集 一、核心问题一:并行策略约束不匹配 问题表现 英伟达(ms-swift)与昇腾(MindSpeed-LLM)的并行维度约束公式不同,脚本无法直接复用。 以四…

2026/10/28 6:18:39

计算机毕业设计之基于SpringBoot的校园快递代取系统的设计与实现

随着新经济的需求和新技术的发展,特别是网络技术的发展,如果可以建立起校园快递代取系统,可以改变传统线下管理方式,在过去的时代里都使用传统的方式实行,既花费了时间,又浪费了精力。在信息如此发达的今天…

2026/10/25 17:40:27

计算机毕业设计之​​​​​​​基于springboot的校园快递管理系统

校园快递管理系统设计的目的是为用户提供快递公司、快递柜信息、寄件信息、接单信息等方面的平台。与PC端应用程序相比,校园快递管理系统的设计主要面向于学校,旨在为管理员和用户、快递员提供一个校园快递管理系统。用户可以通过安卓及时查看快递公司、…

2026/10/30 12:58:56

CentOS 7.9部署Zabbix 6.0全流程指南:避开PHP与数据库版本坑

简介:面向CentOS 7.9运维环境,这份Zabbix 6.0 LTS部署文档适合需要搭建自建监控平台的系统管理员、运维工程师和入门学习者。全文以源码方式给出Zabbix Server与Agent 6.0.12的完整安装流程,并串联Nginx 1.20.2、PHP 7.4.30、MySQL 8.0.28等核…

2026/10/30 12:58:56

OpenCV 4.5.1 预编译包正确集成与避坑指南

简介:本资源为 OpenCV 4.5.1 版本预编译完成的开发包,面向计算机视觉初学者、嵌入式/桌面端快速原型开发者及不熟悉 C 构建流程的算法工程师,旨在解决 OpenCV 源码编译耗时长、依赖复杂、CMake 配置易出错等典型痛点。压缩包为 7z 格式&#…

2026/10/30 12:58:56

C# Modbus TCP读写汇川PLC寄存器实战指南

简介:本资源是一套基于C#实现Modbus TCP协议与汇川PLC通信的完整开发示例,面向工业自动化领域的.NET开发者、PLC上位机工程师及工控系统集成学习者,解决现场设备数据采集、远程监控与协议调试等实际问题。压缩包共148个文件,涵盖9…

2026/10/30 12:58:56

three.js三维图表特效源码解析:从渲染链路到性能优化

简介:这是一份面向Web前端开发者与数据可视化学习者的Three.js三维图形图表特效源码包,适合具备一定JavaScript基础、希望将二维图表升级为立体交互效果的进阶练习者。压缩包共9个文件,约500KB,以7个js脚本为核心,搭配…

2026/10/30 12:58:56

pdf2doc.exe在Win10/Win11的安装配置与闪退排查指南

简介:面向需要在 Windows 上把 PDF 批量转成 Word 的办公人群,这是一份基于 Python 自行整合打包的转换工具,解压后直接运行 pdf2doc.exe 即可使用,免安装、无广告,支持单个文件、多文件以及整个文件夹的批量转换。压缩…

2026/10/30 12:53:56

.NET企业门户完整版:RBAC权限驱动的可上线系统骨架

简介:本资源是一套基于.NET技术构建的企业级门户网站完整实现方案,面向.NET初学者、Web开发工程师及企业信息化建设人员,解决企业对外形象展示、内容管理与用户权限管控等核心需求。压缩包共211个文件,涵盖38个C#后端逻辑文件&…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑