:消息、參數(shù)與多輪對話)
03|ChatModel 實戰(zhàn):消息、參數(shù)與多輪對話《Eino 實戰(zhàn):用 Go 構建 AI 應用與智能體》· 第 03 篇關鍵詞:schema.Message、角色、Generate、Stream、生成參數(shù)、多輪對話、上下文前置條件:已完成 [02|搭建開發(fā)環(huán)境](02|搭建開發(fā)環(huán)境:創(chuàng)建第一個 Eino 項目.md),項目能夠成功調用模型。上一篇我們跑通了第一次調用,但那只是一個單次問答。真實的工單助手需要記住上下文:“這單”“剛才那個用戶”指的都是前幾輪說過的內容。要把它做對,必須先回答一個基礎問題:模型到底收到了什么?答案是:一份消息列表。模型本身沒有記憶,你看到的“多輪對話”,其實是你每次把歷史記錄一起發(fā)過去的結果。這一篇就圍繞消息列表、生成參數(shù)和多輪組織方式展開。一、消息列表就是模型的全部輸入調用Generate時,你傳的是一個[]*schema.Message:typeMessagestruct{Role RoleType// system / user / assistant / toolContentstring// 文本內容ToolCalls[]ToolCall// 僅 assistant 消息使用ToolCallIDstring// 僅 tool 消息使用ToolNamestring// 僅 tool 消息使用ReasoningContentstring// 模型的推理內容(若返回)ResponseMeta*ResponseMeta// 結束原因、Token 用量等Extramap[string]any// 實現(xiàn)相關的附加信息}(以上摘自 Eino v0.9.21 的schema.Message,省略了多模態(tài)等字段,稍后會單獨說明。)其中有兩點值得強調:Role決定這條消息是誰說的。模型依據(jù)角色理解對話結構,寫錯角色會直接改變模型行為。ResponseMeta是模型的“回執(zhí)”。結束原因和 Token 用量都在這里,而不是在Content里。四種角色角色常量用途systemschema.System整體行為約束、角色設定、輸出要求userschema.User用戶輸入assistantschema.Assistant模型此前的回復toolschema.Tool工具調用結果(第 11 篇展開)對應有便捷構造函數(shù):system:=schema.SystemMessage("你是工單助手。")user:=schema.UserMessage("打印機連不上網(wǎng)。")// assistant 消息需要傳入 toolCalls,無工具調用時傳 nilassistant:=schema.AssistantMessage("已記錄,請?zhí)峁┚唧w樓層。",nil)也可以直接構造結構體,兩種方式等價:msg:=schema.Message{Role:schema.User,Content:"打印機連不上網(wǎng)。"}日常建議用構造函數(shù),可讀性更好,也不容易把Role寫錯。二、Generate 與 Stream:同一份輸入,兩種輸出兩者的輸入完全相同,差別只在返回方式:// 非流式:等模型輸出完整內容后一次返回msg,err:=cm.Generate(ctx,messages)// 流式:立即返回讀取器,逐片接收sr,err:=cm.Stream(ctx,messages)defersr.Close()選擇哪一種,取決于交互形態(tài):場景建議后臺批處理、只關心最終結果Generate面向用戶、需要逐步展示