ChatModel - Ollama

基本介绍

Ollama 模型是 ChatModel 接口的一个实现,用于与 Ollama 本地大语言模型服务进行交互,Ollama 是一个开源的本地大语言模型运行框架,支持多种开源模型(如 Llama、Mistral 等),提供简单的 API 接口和完整的性能监控。。该组件实现了 Eino: ChatModel 使用说明

使用方式

组件初始化

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

model, err := NewChatModel(ctx, &ChatModelConfig{
    // 基础配置
    BaseURL:  "http://localhost:11434", // Ollama 服务地址
    Timeout:  30 * time.Second,         // 请求超时时间
    
    // 模型配置
    Model:     "llama2",                // 模型名称
    Format:    "json",                  // 输出格式(可选)
    KeepAlive: &keepAlive,             // 保持连接时间
    
    // 模型参数
    Options: &api.Options{
        Temperature:     0.7,           // 温度
        TopP:           0.9,           // Top-P 采样
        TopK:           40,            // Top-K 采样
        Seed:           42,            // 随机种子
        NumPredict:     100,           // 最大生成长度
        Stop:           []string{},    // 停止词
        RepeatPenalty:  1.1,          // 重复惩罚
        NumCtx:         4096,          // 上下文窗口大小
        NumGPU:         1,             // GPU 数量
        NumThread:      4,             // CPU 线程数
    },
})

生成对话

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

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

消息格式示例:

func main() {
    messages := []*schema.Message{
        // 系统消息
        schema.SystemMessage("你是一个助手"),
        
        // 用户消息
        schema.UserMessage("你好")
    }
}

工具调用

支持绑定工具:

注意,仅有支持 function call 的模型才能使用这个能力

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

完整使用示例

基本对话

package main

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

func main() {
    ctx := context.Background()
    
    // 初始化模型
    model, err := ollama.NewChatModel(ctx, &ollama.ChatModelConfig{
        BaseURL:  "http://localhost:11434",
        Timeout:  30 * time.Second,
        Model:    "llama2",
        Options: &api.Options{
            Temperature: 0.7,
            NumPredict: 100,
        },
    })
    if err != nil {
        panic(err)
    }
    
    // 准备消息
    messages := []*schema.Message{
        schema.SystemMessage("你是一个助手"),
        schema.UserMessage("介绍一下 Ollama"),
    }
    
    // 生成回复
    response, err := model.Generate(ctx, messages)
    if err != nil {
        panic(err)
    }
    
    // 处理回复
    println(response.Content)
    
    // 获取性能指标
    if metrics, ok := response.ResponseMeta.Extra["ollama_metrics"].(api.Metrics); ok {
        println("评估时间:", metrics.EvalDuration)
        println("总时间:", metrics.TotalDuration)
    }
}

流式对话

package main

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

func main() {
    ctx := context.Background()
    
    // 初始化模型
    model, err := ollama.NewChatModel(ctx, &ollama.ChatModelConfig{
        BaseURL:  "http://localhost:11434",
        Timeout:  30 * time.Second,
        Model:    "llama2",
    })
    if err != nil {
        panic(err)
    }
    
    // 准备消息
    messages := []*schema.Message{
        schema.SystemMessage("你是一个助手"),
        schema.UserMessage("讲个笑话"),
    }
    
    // 获取流式回复
    stream, err := model.Stream(ctx, messages)
    if err != nil {
        panic(err)
    }
    defer stream.Close() // 注意关闭 reader
    
    // 处理流式内容
    for {
        chunk, err := stream.Recv()
        if err != nil {
            break
        }
        print(chunk.Content)
    }
}

相关文档


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