03|ChatModel 实战:消息、参数与多轮对话

发布时间:2026/10/11 18:53:31

03|ChatModel 实战:消息、参数与多轮对话 03|ChatModel 实战:消息、参数与多轮对话《Eino 实战:用 Go 构建 AI 应用与智能体》· 第 03 篇关键词:schema.Message、角色、Generate、Stream、生成参数、多轮对话、上下文前置条件:已完成 [02|搭建开发环境](02|搭建开发环境:创建第一个 Eino 项目.md),项目能够成功调用模型。上一篇我们跑通了第一次调用,但那只是一个单次问答。真实的工单助手需要记住上下文:“这单”“刚才那个用户”指的都是前几轮说过的内容。要把它做对,必须先回答一个基础问题:模型到底收到了什么?答案是:一份消息列表。模型本身没有记忆,你看到的“多轮对话”,其实是你每次把历史记录一起发过去的结果。这一篇就围绕消息列表、生成参数和多轮组织方式展开。一、消息列表就是模型的全部输入调用Generate时,你传的是一个[]*schema.Message:typeMessagestruct{Role RoleType// system / user / assistant / toolContentstring// 文本内容ToolCalls[]ToolCall// 仅 assistant 消息使用ToolCallIDstring// 仅 tool 消息使用ToolNamestring// 仅 tool 消息使用ReasoningContentstring// 模型的推理内容(若返回)ResponseMeta*ResponseMeta// 结束原因、Token 用量等Extramap[string]any// 实现相关的附加信息}(以上摘自 Eino v0.9.21 的schema.Message,省略了多模态等字段,稍后会单独说明。)其中有两点值得强调:Role决定这条消息是谁说的。模型依据角色理解对话结构,写错角色会直接改变模型行为。ResponseMeta是模型的“回执”。结束原因和 Token 用量都在这里,而不是在Content里。四种角色角色常量用途systemschema.System整体行为约束、角色设定、输出要求userschema.User用户输入assistantschema.Assistant模型此前的回复toolschema.Tool工具调用结果(第 11 篇展开)对应有便捷构造函数:system:=schema.SystemMessage("你是工单助手。")user:=schema.UserMessage("打印机连不上网。")// assistant 消息需要传入 toolCalls,无工具调用时传 nilassistant:=schema.AssistantMessage("已记录,请提供具体楼层。",nil)也可以直接构造结构体,两种方式等价:msg:=schema.Message{Role:schema.User,Content:"打印机连不上网。"}日常建议用构造函数,可读性更好,也不容易把Role写错。二、Generate 与 Stream:同一份输入,两种输出两者的输入完全相同,差别只在返回方式:// 非流式:等模型输出完整内容后一次返回msg,err:=cm.Generate(ctx,messages)// 流式:立即返回读取器,逐片接收sr,err:=cm.Stream(ctx,messages)defersr.Close()选择哪一种,取决于交互形态:场景建议后台批处理、只关心最终结果Generate面向用户、需要逐步展示
延伸阅读

更多相关文章

2026/10/11 18:48:31

千问API申请全流程:从阿里云百炼到自动化办公实战

1. 项目缘起:用千问 API 给自动化办公装上大脑自动化办公这个事,前几年谈的是 RPA、流程引擎、低代码表单,核心思路是把重复点击的动作录下来、跑起来。但这类方案有个硬伤:但凡需要“理解内容”的环节——比如判断一封邮件是催款…

2026/10/11 18:48:31

广州24小时自助健身房解决方案技术实现与实战指南

广州 24 小时自助健身房解决方案技术实现与实战指南 随着城市化进程的加快,人们对健身的需求日益增长,而传统健身房在时间、地点和管理方式上存在诸多限制。广州作为一线城市,具备良好的经济基础和技术环境,为 24 小时自助健身房提…

2026/10/11 18:48:31

免费数据恢复全攻略:从原理到实操,教你救回误删文件

先说个扎心的现实:绝大多数人的重要数据,都是在毫无防备的情况下丢掉的。U盘还没安全弹出就一把拽走、Solid State Drive(SSD)突然不认盘、Word写了一半电脑断电重启、手机照片误删之后又被新照片覆盖……等你反应过来想要找回来&…

2026/10/11 19:53:34

HarmonyOS应用实例:3D模型多角度观察与手势交互实现

1. 项目为什么值得做:多角度观察背后的真实需求先说一个很常见的场景:电商平台上的商品图,用户只能看固定几个角度,买回家才发现背面有个插口位置不对;博物馆里的文物展品,隔着玻璃只能看正面,想…

2026/10/11 19:53:34

图书馆数据流图全解析:从顶层图到分层分解与ER建模

简介:一份以图书馆数据流图为核心的文档资源,面向图书馆管理系统设计者、软件工程课程学习者以及需要绘制DFD的开发人员,帮助梳理借书证管理、读者管理、图书借阅等核心业务流程与数据走向。压缩包内仅1个doc文件,容量约886KB&…

2026/10/11 19:53:34

自制编程语言源码编译指南:MinGW与bison/flex避坑

简介:面向想从零动手实现编程语言的开发者,这份PDF资料系统梳理自制编程语言的核心知识,涵盖语言语法与语义设计、常见设计原则、编译器与解释器实现、运行时环境与资源管理等环节。资料结合MinGW、bison/flex等常用工具链,介绍词…

2026/10/11 19:53:34

Android Jetpack 组件全解析:架构分层、选型搭配与实战落地

每次接手新项目,看到工程里 Activity 和 Fragment 里堆了两千行代码、异步回调层层嵌套、配置变更直接数据丢失的时候,我就知道团队又回到了 Jetpack 问世前的老路上。倒不是说没人用 Jetpack,而是很多新人对它的理解停留在"用了个 View…

2026/10/11 19:48:34

Word培训申请表制作全攻略:字段设计、内容控件与批量归档

简介:一份直接可用的企业培训申请表docx模板,面向HR、行政及各部门负责人,用于规范员工培训提报、审批与归档流程。表格设计了申请部门、申请人、申请日期、培训方式、期限、培训对象、参训人数、申请原因、培训内容等核心字段,并…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

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

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

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