Go + Eino 构建 AI Agent(一):Hello LLM

TL;DR: Eino 是 Go 版的 LangChain。本文介绍 ChatModel.Generate() 非流式调用和 ChatModel.Stream() 流式调用,以及如何通过 schema.Message 构建多轮对话。

Eino - 字节跳动 CloudWeGo 团队开源的 Go 语言 AI 应用开发框架。

环境准备

1. Go 版本要求

bash 复制代码
go version  # 需要 Go 1.21+

2. 创建项目

bash 复制代码
mkdir ai-agent-go && cd ai-agent-go
go mod init ai-agent-go

3. 安装依赖

bash 复制代码
# Eino 核心包
go get github.com/cloudwego/eino@latest

# 火山引擎豆包模型(国内推荐)
go get github.com/cloudwego/eino-ext/components/model/ark@latest

# 自动加载 .env 文件
go get github.com/joho/godotenv@latest

4. 获取 API Key

本文使用火山引擎豆包(字节跳动的大模型服务),Eino 原生支持,国内访问稳定。

  1. 访问 火山引擎控制台
  2. 创建推理接入点(Endpoint)
  3. 获取 API Key

5. 配置环境变量

在项目根目录创建 .env 文件:

bash 复制代码
ARK_API_KEY=你的API密钥
ARK_MODEL_ID=ep-xxxxxxxx

⚠️ 记得把 .env 加入 .gitignore,避免泄露密钥!

Hello Eino:第一次调用大模型

最简代码

创建文件 cmd/01_hello_llm/main.go:

go 复制代码
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/cloudwego/eino-ext/components/model/ark"
	"github.com/cloudwego/eino/schema"
	"github.com/joho/godotenv"
)

func init() {
	godotenv.Load() // 自动加载 .env 文件
}

func main() {
	ctx := context.Background()

	// 1. 创建 ChatModel
	chatModel, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
		APIKey: os.Getenv("ARK_API_KEY"),
		Model:  os.Getenv("ARK_MODEL_ID"),
	})
	if err != nil {
		log.Fatalf("创建ChatModel失败: %v", err)
	}

	// 2. 准备消息
	messages := []*schema.Message{
		{
			Role:    schema.User,
			Content: "你好!请用一句话介绍什么是AI Agent",
		},
	}

	// 3. 生成回复
	response, err := chatModel.Generate(ctx, messages)
	if err != nil {
		log.Fatalf("生成失败: %v", err)
	}

	fmt.Println("🤖 AI回复:", response.Content)
}

运行:

bash 复制代码
go run cmd/01_hello_llm/main.go

消息格式

Eino 使用 schema.Message 表示消息,这是与大模型交互的基本单位:

go 复制代码
// 四种消息角色
schema.System    // 系统提示(设定 AI 的行为)
schema.User      // 用户输入
schema.Assistant // AI 回复
schema.Tool      // 工具返回结果

// 便捷创建方法
schema.SystemMessage("你是一个助手")
schema.UserMessage("你好")
schema.AssistantMessage("你好!有什么可以帮你的?", nil)

带 System 提示的对话

System 消息用于设定 AI 的角色和行为:

go 复制代码
messages := []*schema.Message{
	schema.SystemMessage("你是一个专业的Go语言专家,回答要简洁专业"),
	schema.UserMessage("Go的goroutine和线程有什么区别?"),
}

// 使用 Option 调整模型参数
response, err := chatModel.Generate(ctx, messages,
	model.WithTemperature(0.7), // 创造性程度(0-1)
	model.WithMaxTokens(500),   // 最大输出长度
)

流式输出

Stream() 方法实现边生成边返回,适合聊天界面:

go 复制代码
// 使用 Stream 方法
streamReader, err := chatModel.Stream(ctx, messages)
if err != nil {
	log.Fatal(err)
}
defer streamReader.Close()

fmt.Print("🤖 AI: ")
for {
	chunk, err := streamReader.Recv()
	if err == io.EOF {
		break // 流结束
	}
	if err != nil {
		log.Fatal(err)
	}
	fmt.Print(chunk.Content) // 实时输出每个字
}
fmt.Println()

多轮对话

关键:每次调用时传入完整的对话历史。

go 复制代码
// 对话历史
history := []*schema.Message{
	schema.SystemMessage("你是一个友好的AI助手,会记住对话内容"),
}

scanner := bufio.NewScanner(os.Stdin)
fmt.Println("💬 多轮对话(输入 'quit' 退出)")

for {
	fmt.Print("\n你: ")
	scanner.Scan()
	input := strings.TrimSpace(scanner.Text())
	if input == "quit" {
		break
	}

	// 添加用户消息到历史
	history = append(history, schema.UserMessage(input))

	// 生成回复(传入完整历史)
	response, err := chatModel.Generate(ctx, history)
	if err != nil {
		log.Printf("生成失败: %v", err)
		continue
	}

	// 添加 AI 回复到历史
	history = append(history, response)

	fmt.Println("AI:", response.Content)
}

Trade-offs

方法 适用场景 不适用场景
Generate() 后台批量处理、需要完整结果再处理 实时聊天界面(用户体验差)
Stream() 聊天界面、长文本生成 需要原子性结果的场景
多轮对话(传完整历史) 需要上下文的对话 历史过长时会超出 token 限制

Eino vs 直接调用 API:

  • Eino 提供统一抽象,切换模型只需改配置
  • 直接调用 API 更轻量,但换模型需要改代码

总结

方法 用途
Generate() 非流式调用,等待完整响应
Stream() 流式调用,边生成边返回
schema.Message 消息结构,支持 System/User/Assistant/Tool 四种角色
相关推荐
乌恩大侠32 分钟前
从 5G 通信到厘米级感知:基于 NVIDIA Aerial、SRS 与 UL-TDOA 构建 6G 无线定位实验平台
人工智能·5g·电信大模型
云和数据.ChenGuang8 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
西西木科技丨Shopify开发机构8 小时前
CalDigit TS4案例:AI产品图的Shopify整站接入与验收
人工智能·shopify·独立站
2601_965448878 小时前
AI视频制作:做系列节气民俗视频音色不统一,AI 音色克隆省事的方法
人工智能·机器学习·音视频
美狐美颜SDK开放平台8 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
HRaitest9 小时前
秋招技术岗招聘提效:三类 AI 招聘方案的技术底层与选型逻辑
大数据·人工智能·求职招聘·ai-native
天远数科9 小时前
零信任架构实战:基于天远企业股权变更构建自动化商业银行对公授信存续期股权异动与资产抽逃预警网关
运维·人工智能·架构·自动化
车软学堂9 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
海盗123410 小时前
AI 新闻日报 10-28:Atria Dawn 完整版开源、Cursor Agent SDK 转正、Genie 4 实时世界模型
人工智能·机器人·开源·人工智能aigc
志尊宝10 小时前
AI原生前端开发(035):AI时代的工程化最佳实践总结
人工智能·ai-native