杠精派
派聪明
0/512

热门评论

xuxinyi 2026年06月21日 15:34
@派聪明 为什么Message和 ChatResponse要定义成record类型?大模型输出的格式是固定的吗都包含哪些内容?能处理提取成ChatResponse
点赞
回复3 取消回复
派聪明 2026年06月21日 15:35
结合参考资料,这里为您清晰地解答: **1. 为什么 Message 和 ChatResponse 使用 `record` 类型?** `record` 是 Java14 引入的特性,专门用来定义纯数据载体。 * **简洁安全**:参考资料中 `Message`需要包含 `role`、`content`、`toolCalls`等字段。使用 `record` 只需一行代码(如 `public record Message(...)`),编译器就会自动生成构造器、Getter(如 `msg.role()`)、`equals()` 和 `toString()`等方法。 * **不可变性**:`record` 是不可变的(final),这使得它在多步骤的 ReAct循环和上下文历史记录中更加安全,避免了被意外篡改的风险。 **2. 大模型输出的格式是固定的吗?** 大模型的 API输出**并不是完全固定的自然语言**,而是通过 HTTP返回**标准化的 JSON 格式数据**。为了让大模型知道如何输出,Agent程序会在请求时带上定义好的 JSON Schema,约束大模型按规范返回。 **3.输出都包含哪些内容?如何提取成 ChatResponse?** 参考资料提到,Agent 发送 HTTP请求后会拿到一段 JSON 字符串(`responseBody`)。这段 JSON 通常包含以下核心内容: * **content**:普通的文本回复内容。 * **tool_calls**:工具调用请求数组(包含工具调用的 `id`,以及具体调用的函数名 `name` 和参数 `arguments`)。 * **token 使用信息**:如输入/输出的 Token消耗量。 **提取流程:** 程序会使用 JSON 解析库(如参考资料中用到的 Jackson,通过 `mapper.readTree(responseBody)`读取 JSON树),精准提取出 `content` 和 `tool_calls`节点,然后封装映射成 Java中的 `ChatResponse` 对象。这样,Agent核心循环就能方便地调用 `response.hasToolCalls()`判断是否需要执行工具,或者直接获取文本内容。
1
回复 取消回复
展开剩余 2 条回复

66 条评论

小桃气 2026年09月06日 11:16
@派聪明 从测试的角度这部分内容shifu已经执行了ReAct Case测试
点赞
回复1 取消回复
派聪明 2026年09月06日 11:17
从测试角度看,这部分内容对应的 ReAct Case测试可以这样理解和验证: **一、已覆盖的核心场景(文章运行示例即测试用例)** 1. **单步工具调用**:`创建Java项目demo` →验证 create_project被正确触发、参数正确、结果返回LLM2. **读改写组合**:读取Hello.java→修改输出→写回 →验证多步依赖顺序(read在write前) 3. **命令执行链**:编译→运行→根据exit code判断成功 →验证Agent能根据工具输出决策下一步4. **无工具纯对话**:LLM不返回tool_calls时循环应立即终止并输出结果**二、补充建议的边界Case** - **循环终止**:构造连续工具调用场景,验证MAX_ITERATIONS=10生效,返回“达到最大迭代次数限制” - **异常注入**:read_file读不存在的文件、execute_command命令失败(exit code≠0),验证错误信息以tool消息回传给LLM并影响后续决策- **网络异常**:模拟API超时/限流,验证重试逻辑(MAX_RETRIES) - **上下文维护**:clear命令后验证conversationHistory被清空、system prompt保留- **工具参数校验**:LLM生成的arguments解析失败时的容错- **消息完整性**:assistant消息必须携带toolCalls回传,tool消息的toolCallId必须与请求id匹配**三、测试方式** - 单元测试:Mock GLMClient返回预置的tool_calls响应,断言ToolRegistry调用与消息序列-集成测试:真实API跑通端到端流程-断言核心点:**循环继续条件=存在tool_calls,终止条件=纯文本响应**,这是ReAct正确性的判定基准如果需要,我可以帮你写一个基于Mock的Agent ReAct循环JUnit测试代码。
点赞
回复 取消回复
Next Station Ashore 2026年09月02日 21:48
引用原文:Shell 命令
shell命令是什么样的命令,类似Linux那种吗?
点赞
回复 取消回复
勤恳的冬瓜 2026年08月24日 16:16
引用原文:LM 会根据这个定义,在需要时生成正确的参数
整体流程:把"对话消息 + 工具列表"拼成一个 JSON 请求体 ↓ 用 OkHttp 发 POST 到模型 API(带鉴权) ↓ 拿到响应 JSON 字符串 ↓ 用 Jackson 解析出模型回复内容
点赞
回复 取消回复
勤恳的冬瓜 2026年08月23日 15:55
引用原文:个 JSON Schema
JSON Schema 是一种用 JSON 来描述"别的 JSON 数据长什么样"的格式——本质是给数据写"类型说明书 / 格式说明书"。
点赞
回复 取消回复
安和 2026年08月07日 07:03
引用原文:我一直很好奇这玩意儿到底是怎么实现的。
@派聪明,最新版本的paicli和claude code相比呢。
点赞
回复1 取消回复
派聪明 2026年08月07日 07:03
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
A.Mars(水准) 2026年08月06日 01:10
引用原文:我们的简化版用简单列表,但原理是一样的。
我们的简化版和Claude Code的原理是什么@派聪明
点赞
回复1 取消回复
派聪明 2026年08月06日 01:10
小派正在努力回答中, 耐心等待一下吧...
1
回复 取消回复
克莱因蓝 2026年08月04日 10:41
引用原文:描述和参数定义会传给 LLM,让 LLM 知道什么时候该用这个工具、需要什么参数。执行逻辑是实际的 Java 代码,负责完成任务。
@派聪明llm传回要执行的工具和参数后,代码是怎么接收到参数的,工具执行的入口在哪里
点赞
回复1 取消回复
派聪明 2026年08月04日 10:41
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
过时的草莓 2026年07月31日 22:29
引用原文: JSON Schema
@派聪明,这个是什么
点赞
回复1 取消回复
派聪明 2026年07月31日 22:29
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
mwdb996 2026年07月23日 19:59
引用原文:工具定义格式 要让 LLM 知道有哪些工具可用,需要按照特定格式定义工具: public record Tool(String name, String description, JsonNode parameters) {} 复制代码 parameters 是一个 JSON Schema,描述工具需要哪些参数、参数类型是什么。比如 write_file 工具的参数定义: { "type": "object", "properties": { "path": { "type": "string", "description": "文件路径" }, "content": { "type": "string", "description": "文件内容" } }, "required": ["path", "content"] } 复制代码 LLM 会根据这个定义,在需要时生成正确的参数。
@派聪明 这个应该放在哪个文件里面?
点赞
回复1 取消回复
派聪明 2026年07月23日 19:59
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
绿蜥蜴 2026年07月22日 22:22
引用原文:这个循环的关键点是:只要 LLM 还在请求工具调用,循环就继续。只有当 LLM 直接回复内容(没有 tool_calls)时,才认为任务完成。
感觉这里不太合理,很多场景下不需要调用工具,只是waiting_user状态,比如讨论设计方案。这种情况下直接判断是否有工具调用来结束对话比较局限
1
回复 取消回复

目录