[Eino入门]——quickStart

4 阅读2分钟

环境准备

  1. Go 环境:确保已安装 Go 1.18 或更高版本。

  2. Ark API Key:前往 Ark 平台 注册并获取 API Key,选择开通所有模型即可,有免费额度。(注意:API Key要绝对保密)

  3. 取到API Key之后放入环境变量,不会放就先随便找个地方放一下,不要找不到就行。

  4. 项目初始化

    bash

    go mod init eino-quickstart
    

安装 Eino 及相关组件

  • github.com/cloudwego/eino:Eino 框架核心
  • github.com/cloudwego/eino-ext/components/model/ark:Ark 模型适配器

执行以下命令:

bash

go get github.com/cloudwego/eino
go get github.com/cloudwego/eino-ext/components/model/ark

编写代码

创建一个 main.go 文件:

go

package main

import (
	"context"
	"log"
	"os"
	"sync"

	"github.com/cloudwego/eino-ext/components/model/ark"   // Ark 模型实现
	"github.com/cloudwego/eino/schema"                     // Eino 核心数据结构
)

这里先定义一下模型实例,使用 sync.Once 保证单例初始化,

var (
	arkModel *ark.ChatModel
	once     sync.Once

	// 模型调用参数(非必须参数,可根据需要调整)
	maxTokens = 1500          // 最大输出 token 数
	topP      = float32(0.9)  // 核采样概率阈值
)

开始初始化模型

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

	// 使用 sync.Once 确保模型只初始化一次
	once.Do(func() {
		var err error
		// 创建 Ark 聊天模型实例
		arkModel, err = ark.NewChatModel(ctx, &ark.ChatModelConfig{
			APIKey:    os.Getenv("ARK_API_KEY"),       // Required:从环境变量读取 API Key
                        // 要么直接以string形式明文写入
			Model:     "doubao-seed-2-0-code-preview-260215", // Required:模型名称
			MaxTokens: &maxTokens,                      // 可选:最大输出 token
			TopP:      &topP,                            // 可选:采样阈值
		})
		if err != nil {
			log.Fatal("Ark 模型初始化失败: ", err)
		}
	})

定义消息结构体schema.message,构造用户消息

必选:Role(谁发送的?User还是Assistant还是别的什么)还有Content(消息具体内容)

	userMessage := &schema.Message{
		Role:    schema.User,
		Content: "怎么使用Eino框架与ark模型对话,给我一个最简单的方案",
	}

调用模型的 Stream 方法,流式输出(一块一块输出)

model.Stream返回的是一个schema.StreamReader, 它提供了一个一个统一的Recv方法,我们不用管怎么实现的,只需要知道Recv返回的是chunk,可以直接print(chunk.Content)

	streamReader, err := arkModel.Stream(ctx, []*schema.Message{userMessage})
	if err != nil {
		panic(err)
	}
	defer streamReader.Close() // 确保关闭流

	// 逐块接收并打印回复内容
	for {
		chunk, err := streamReader.Recv()
		if err != nil {
			// 流结束或发生错误时退出循环
			break
		}
		print(chunk.Content) // 打印当前块的内容
	}
}

结束,运行