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

简介: 本文介绍了如何使用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 方法,后面继续学习(*∩_∩*)

目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 机器人
黑箱与具身之间的因子框架( Prompt大模型的自我描述 系列五)
本文探讨大模型的“量子式黑箱”困境,指出其虽强大却缺乏可解释性。作者提出“因子框架”,以结构性推理替代概率坍缩,实现因果可控;并重新定义多模态,从“模态互通”走向“因子统一”。最终指向具身智能的真正起点:让AI在逻辑中融合感知,走出语言,迈向真实世界。
228 9
|
5月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
364 86
|
5月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
2371 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
4月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
979 4
|
4月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
471 1
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
288 1
|
5月前
|
人工智能 云栖大会
2025云栖大会大模型应用开发与部署|门票申领
2025云栖大会大模型应用开发与部署门票申领
326 9
|
5月前
|
监控 数据可视化 Linux
LangSmith:大模型应用开发的得力助手
LangSmith 是大模型应用开发的高效助手,提供从调试、追踪到评估的全流程支持。通过可视化追踪树,清晰展现 LLM 应用每一步执行逻辑,提升可观察性;支持提示词优化、实时监控与自动化评估,助力开发者快速定位问题、迭代优化,构建稳定可靠的智能应用。
617 0
LangSmith:大模型应用开发的得力助手
|
4月前
|
缓存 API 调度
70_大模型服务部署技术对比:从框架到推理引擎
在2025年的大模型生态中,高效的服务部署技术已成为连接模型能力与实际应用的关键桥梁。随着大模型参数规模的不断扩大和应用场景的日益复杂,如何在有限的硬件资源下实现高性能、低延迟的推理服务,成为了所有大模型应用开发者面临的核心挑战。