ChatModel - ARK

基本介绍

Ark 是 ChatModel 接口的一个实现,用于与火山引擎 Ark Runtime 服务进行交互。Ark Runtime 是火山引擎提供的大语言模型运行时服务,提供了丰富的模型选择和完整的 API 功能。本组件通过 Ark Runtime Go SDK 与服务进行交互,可调用火山引擎上部署的 豆包大模型、暗影之月大模型 等。该组件实现了 Eino: ChatModel 使用说明

使用方式

组件初始化

Ark 模型通过 NewChatModel 函数进行初始化,主要配置参数如下:

model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
    // 服务配置
    BaseURL:    "https://ark.cn-beijing.volces.com/api/v3", // 服务地址
    Region:     "cn-beijing",                               // 区域
    HTTPClient: httpClient,                                 // 自定义 HTTP 客户端
    Timeout:    &timeout,                                   // 超时时间
    RetryTimes: &retries,                                  // 重试次数
    
    // 认证配置(二选一)
    APIKey:    "your-api-key",     // API Key 认证
    AccessKey: "your-ak",          // AK/SK 认证
    SecretKey: "your-sk",
    
    // 模型配置
    Model:     "endpoint-id",      // 模型端点 ID
    
    // 生成参数
    MaxTokens:         &maxTokens, // 最大生成长度
    Temperature:       &temp,      // 温度
    TopP:             &topP,      // Top-P 采样
    Stop:             []string{},  // 停止词
    FrequencyPenalty: &fp,        // 频率惩罚
    PresencePenalty:  &pp,        // 存在惩罚
    RepetitionPenalty: &rp,       // 重复惩罚
    N:                &n,         // 生成数量
    
    // 高级参数
    ResponseFormat:    &format,    // 响应格式
    LogitBias:        map[string]int{}, // Token 偏置
    LogProbs:         &logProbs,  // 是否返回概率
    TopLogProbs:      &topLp,     // Top K 概率数量
    User:             &user,      // 用户标识
})

生成对话

对话生成支持普通模式和流式模式:

func main() {
    // 普通模式
    response, err := model.Generate(ctx, messages)
    
    // 流式模式
    stream, err := model.Stream(ctx, messages)
}

消息格式示例:

注意,是否支持多模态的图片需要看具体的模型

func main() {
    messages := []*schema.Message{
        // 系统消息
        schema.SystemMessage("你是一个助手"),
        
        // 文本消息
        schema.UserMessage("你好"),
        
        // 多模态消息(包含图片)
        {
            Role: schema.User,
            MultiContent: []schema.ChatMessagePart{
                {
                    Type: schema.ChatMessagePartTypeText,
                    Text: "这张图片是什么?",
                },
                {
                    Type: schema.ChatMessagePartTypeImageURL,
                    ImageURL: &schema.ChatMessageImageURL{
                        URL:    "https://example.com/image.jpg",
                        Detail: schema.ImageURLDetailAuto,
                    },
                },
            },
        },
    }
}

工具调用

支持绑定工具:

// 定义工具
tools := []*schema.ToolInfo{
    {
        Name: "search",
        Desc: "搜索信息",
        ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
            "query": {
                Type:     schema.String,
                Desc:     "搜索关键词",
                Required: true,
            },
        }),
    },
}

// 绑定工具
err := model.BindTools(tools)

工具相关信息,可以参考 [🚧]Eino: ToolsNode 使用说明

完整使用示例

直接对话

package main

import (
    "context"
    "time"
    
    "github.com/cloudwego/eino-ext/components/model/ark"
    "github.com/cloudwego/eino/schema"
)

func main() {
    ctx := context.Background()
    
    // 初始化模型
    model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
        APIKey:  "your-api-key",
        Region:  "cn-beijing",
        Model:   "endpoint-id",
        Timeout: ptrOf(30 * time.Second),
    })
    if err != nil {
        panic(err)
    }
    
    // 准备消息
    messages := []*schema.Message{
        schema.SystemMessage("你是一个助手"),
        schema.UserMessage("介绍一下火山引擎"),
    }
    
    // 生成回复
    response, err := model.Generate(ctx, messages)
    if err != nil {
        panic(err)
    }
    
    // 处理回复
    println(response.Content)
    
    // 获取 Token 使用情况
    if usage := response.ResponseMeta.Usage; usage != nil {
        println("提示 Tokens:", usage.PromptTokens)
        println("生成 Tokens:", usage.CompletionTokens)
        println("总 Tokens:", usage.TotalTokens)
    }
}

流式对话

package main

import (
    "context"
    "time"
    
    "github.com/cloudwego/eino-ext/components/model/ark"
    "github.com/cloudwego/eino/schema"
)

func main() {
    ctx := context.Background()
    
    // 初始化模型
    model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
        APIKey:  "your-api-key",
        Model:   "ep-xxx",
    })
    if err != nil {
        panic(err)
    }
    
    // 准备消息
    messages := []*schema.Message{
        schema.SystemMessage("你是一个助手"),
        schema.UserMessage("介绍一下 Eino"),
    }
    
    // 获取流式回复
    reader, err := model.Stream(ctx, messages)
    if err != nil {
        panic(err)
    }
    defer reader.Close() // 注意要关闭
    
    // 处理流式内容
    for {
        chunk, err := reader.Recv()
        if err != nil {
            break
        }
        print(chunk.Content)
    }
}

相关文档


最后修改 January 9, 2025 : feat: add eino cn docs (#1182) (ad75444)