eino — 基于go语言的大模型应用开发框架(二)

本文涉及的产品
通义法睿合同智能审查,1个月8份合同免费体验
简介: 本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。

实现一个基本的LLM应用

ChatModel 是 Eino 框架中对对话大模型的抽象,它提供了统一的接口来与不同的大模型服务(如 OpenAI、Ollama 等)进行交互。

ChatModel interface定义如下所示:

type ChatModel interface {
    Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error)
    Stream(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.StreamReader[*schema.Message], error)
    BindTools(tools []*schema.ToolInfo) error
}

ChatModel组件方法

  1. Generate方法
  • 功能:生成完整的模型响应
  • 参数:
  • ctx:上下文对象,用于传递请求级别的信息,同时也用于传递 Callback Manager
  • input:输入消息列表
  • opts:可选参数,用于配置模型行为
  • 返回值:
  • *schema.Message:模型生成的响应消息
  • error:生成过程中的错误信息
  1. Stream方法
  • 功能:以流式方式生成模型响应
  • 参数:与 Generate 方法相同
  • 返回值:
  • *schema.StreamReader[*schema.Message]:模型响应的流式读取器
  • error:生成过程中的错误信息
  1. BindTools方法
  • 功能:为模型绑定可用的工具
  • 参数:
  • tools:工具信息列表
  • 返回值:
  • error:绑定过程中的错误信息


schema.Message结构体

Message结构体如下所示,其中:

  • Role字段有4种类型,分别为assistant、user、system、tool;
  • Content字段支持多模态内容,文本、图片、音频等;
  • ResponseMeta字段包含响应原因以及token使用统计;

image.png

type Message struct {
    // Role 表示消息的角色(system/user/assistant/tool)
    Role RoleType
    // Content 是消息的文本内容
    Content string
    // MultiContent 是多模态内容,支持文本、图片、音频等
    MultiContent []ChatMessagePart
    // Name 是消息的发送者名称
    Name string
    // ToolCalls 是 assistant 消息中的工具调用信息
    ToolCalls []ToolCall
    // ToolCallID 是 tool 消息的工具调用 ID
    ToolCallID string
    // ResponseMeta 包含响应的元信息
    ResponseMeta *ResponseMeta
    // Extra 用于存储额外信息
    Extra map[string]any
}

model.Option结构体

可以通过以下方式设置Option:

image.png

// Option is the call option for ChatModel component.
type Option struct {
    apply func(opts *Options)

    implSpecificOptFn any
}

Option具体使用方式如下所示:

response, err := chatModel.Generate(ctx, messages,
        model.WithMaxTokens(4096),
        model.WithTemperature(1.0),
    )


实现一个基础的LLM应用


eino的当前版本还不具备对deepseek的推理部分的独立展示,即返回的Message字段中只有Content字段,还没有更新独立的推理部分的reasoning_content字段。

image.png

package main

import (
    "context"
    "fmt"
    "github.com/cloudwego/eino/components/model"
    "github.com/cloudwego/eino/schema"

    "github.com/cloudwego/eino-ext/components/model/openai"
    "log"
)

func main() {
    ctx := context.Background()
    chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
        Model:   "ep-20250219155847-*****",
        APIKey:  "***************************",
        BaseURL: "https://************************",
    })
    if err != nil {
        log.Fatal(err)
        return
    }

    // 准备输入消息
    messages := []*schema.Message{
        {
            Role:    schema.System,
            Content: "你是一个专业的个人助理。",
        },
        {
            Role:    schema.User,
            Content: "你好!",
        },
    }
    response, err := chatModel.Generate(ctx, messages,
        model.WithMaxTokens(4096),
        model.WithTemperature(1.0),
    )

    fmt.Print(response.Content)
}   


模板功能

Eino同样提供了类似langchain的对话模板渲染功能,支持以下三种模板格式:

  • FString:Python 风格的简单字符串格式化(例如:“你好,{name}!")
  • Jinja2:支持丰富表达式的 Jinja2 风格模板(例如:“你好,{{name}}!")
  • GoTemplate:Go 语言内置的 text/template 格式(例如:“你好,{{.name}}!")

以下部分是官方文档中的代码,以FString格式+消息占位符实现

// eino-examples/quickstart/chat/template.go

import (
    "context"

    "github.com/cloudwego/eino/components/prompt"
    "github.com/cloudwego/eino/schema"
)

// 创建模板,使用 FString 格式
template := prompt.FromMessages(schema.FString,
   // 系统消息模板
   schema.SystemMessage("你是一个{role}。你需要用{style}的语气回答问题。你的目标是帮助程序员保持积极乐观的心态,提供技术建议的同时也要关注他们的心理健康。"),

   // 插入需要的对话历史(新对话的话这里不填)
   schema.MessagesPlaceholder("chat_history", true),

   // 用户消息模板
   schema.UserMessage("问题: {question}"),
)

// 使用模板生成消息
messages, err := template.Format(context.Background(), map[string]any{
   "role":     "程序员鼓励师",
   "style":    "积极、温暖且专业",
   "question": "我的代码一直报错,感觉好沮丧,该怎么办?",
   // 对话历史(这个例子里模拟两轮对话历史)
   "chat_history": []*schema.Message{
      schema.UserMessage("你好"),
      schema.AssistantMessage("嘿!我是你的程序员鼓励师!记住,每个优秀的程序员都是从 Debug 中成长起来的。有什么我可以帮你的吗?", nil),
      schema.UserMessage("我觉得自己写的代码太烂了"),
      schema.AssistantMessage("每个程序员都经历过这个阶段!重要的是你在不断学习和进步。让我们一起看看代码,我相信通过重构和优化,它会变得更好。记住,Rome wasn't built in a day,代码质量是通过持续改进来提升的。", nil),
   },
})


总结


本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的 ChatModel 接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。通过 Generate 方法可以生成完整的模型响应, Stream 方法则以流式方式返回结果,而 BindTools 方法用于为模型绑定工具。

同时,介绍了 Option 模式配置可以配置模型的对应参数,模板功能可以实现基于前端、用户自定义的角色以及Prompt。

目前只介绍了 ChatModel  其中的 Generate 方法,后面继续学习(*∩_∩*)

目录
相关文章
|
25天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
26天前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
27天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
34 3
|
1月前
|
存储 开发框架 Devops
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
217 8
|
27天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
27天前
|
SQL 安全 Java
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
|
1月前
|
存储 算法 安全
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
29 0
|
机器学习/深度学习 人工智能 iOS开发
|
1月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
1月前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
51 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了

热门文章

最新文章