快速上手 Golang 的 AI 应用开发框架 Eino(DeepSeek API)

开始

Go 版本要求

Eino 要求 Go 1.22 及以上版本

安装依赖

go get github.com/cloudwego/eino@latest
go get github.com/cloudwego/eino-ext/components/model/openai@latest

创建 API key

在 DeepSeek API 开放平台创建一个 API key

第一个 Eino 程序

创建一个 ChatModel

DeepSeek API 文档提供了 API 地址以及可用的模型

ctx := context.Background()
// 接入 DeepSeek API
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
    BaseURL: "https://api.deepseek.com",
    APIKey:  "Your API key",
    Model:   "deepseek-v4-flash",
})
if err != nil {
    fmt.Println(fmt.Sprintf("创建 ChatModel 失败: %v", err))
}

同步调用(Generate)

// System Message:模型的全局设定(行为准则和角色定位),仅在对话开头设置一次
// User Message:用户的输入
// Assistant Message:模型生成的回复
messages := []*schema.Message{
    schema.SystemMessage("你是一个专业的 Go 语言技术顾问,回答简洁准确"),
    schema.UserMessage("用一句话解释什么是 goroutine"),
}

// 调用 Generate 方法,同步获取完整回复
response, err := chatModel.Generate(ctx, messages)
if err != nil {
    fmt.Println(fmt.Sprintf("调用失败: %v", err))
}

fmt.Println("模型回复:")
fmt.Println(response.Content)

流式调用(Stream)

messages := []*schema.Message{
    schema.SystemMessage("你是一个 Go 语言专家,擅长深入浅出地讲解技术概念"),
    schema.UserMessage("请用 200 字左右解释 Go 语言的 channel 是什么,以及它在并发编程中的作用"),
}

// 调用 Stream 方法,获取流
stream, err := chatModel.Stream(ctx, messages)
if err != nil {
    fmt.Println(fmt.Sprintf("调用失败: %v", err))
}
defer stream.Close()

fmt.Println("模型回复(流式):")
// 循环读取流式数据块
for {
    chunk, err := stream.Recv()
    // 当模型生成结束,Recv() 返回 io.EOF 错误
    if errors.Is(err, io.EOF) {
       break
    }
    if err != nil {
       fmt.Println(fmt.Sprintf("读取失败: %v", err))
    }
    // 读取到一块立即输出
    fmt.Print(chunk.Content)
}
fmt.Println()

多轮对话

// LLM 没有真正的记忆,多轮对话中,当前消息会和历史消息一起发送给模型
// 历史消息列表,先放入 System Message
history := []*schema.Message{
    schema.SystemMessage("你是一个友好的 Go 语言助手,回答简洁,每次不超过 100 字"),
}

scanner := bufio.NewScanner(os.Stdin)
fmt.Println("开始对话(输入 quit 退出):")

for {
    fmt.Print("\n你: ")
    if !scanner.Scan() {
       break
    }
    input := strings.TrimSpace(scanner.Text())
    if input == "quit" {
       fmt.Println("再见!")
       break
    }
    if input == "" {
       continue
    }
    // 追加 User Message
    history = append(history, schema.UserMessage(input))

    // 每轮对话都使用完整的历史消息列表
    stream, err := chatModel.Stream(ctx, history)
    if err != nil {
       fmt.Println(fmt.Sprintf("调用失败: %v", err))
       continue
    }

    fmt.Print("助手: ")
    var reply strings.Builder
    for {
       chunk, err := stream.Recv()
       if errors.Is(err, io.EOF) {
          break
       }
       if err != nil {
          fmt.Println(fmt.Sprintf("读取失败: %v", err))
          break
       }
       fmt.Print(chunk.Content)
       reply.WriteString(chunk.Content)
    }
    stream.Close()
    fmt.Println()

    // 追加 Assistant Message
    history = append(history, &schema.Message{
       Role:    schema.Assistant,
       Content: reply.String(),
    })
}

完整代码

package main

import (
    "bufio"
    "context"
    "errors"
    "fmt"
    "io"
    "os"
    "strings"

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

func main() {
    ctx := context.Background()
    // 接入 DeepSeek API
    chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
       BaseURL: "https://api.deepseek.com",
       APIKey:  "Your API key",
       Model:   "deepseek-v4-flash",
    })
    if err != nil {
       fmt.Println(fmt.Sprintf("创建 ChatModel 失败: %v", err))
    }


    // 同步调用
    // System Message:模型的全局设定(行为准则和角色定位),仅在对话开头设置一次
    // User Message:用户的输入
    // Assistant Message:模型生成的回复
    messages1 := []*schema.Message{
       schema.SystemMessage("你是一个专业的 Go 语言技术顾问,回答简洁准确"),
       schema.UserMessage("用一句话解释什么是 goroutine"),
    }

    // 调用 Generate 方法,同步获取完整回复
    response, err := chatModel.Generate(ctx, messages1)
    if err != nil {
       fmt.Println(fmt.Sprintf("调用失败: %v", err))
    }

    fmt.Println("模型回复:")
    fmt.Println(response.Content)


    // 流式调用
    messages2 := []*schema.Message{
       schema.SystemMessage("你是一个 Go 语言专家,擅长深入浅出地讲解技术概念"),
       schema.UserMessage("请用 200 字左右解释 Go 语言的 channel 是什么,以及它在并发编程中的作用"),
    }

    // 调用 Stream 方法,获取流
    stream, err := chatModel.Stream(ctx, messages2)
    if err != nil {
       fmt.Println(fmt.Sprintf("调用失败: %v", err))
    }
    defer stream.Close()

    fmt.Println("模型回复(流式):")
    // 循环读取流式数据块
    for {
       chunk, err := stream.Recv()
       // 当模型生成结束,Recv() 返回 io.EOF 错误
       if errors.Is(err, io.EOF) {
          break
       }
       if err != nil {
          fmt.Println(fmt.Sprintf("读取失败: %v", err))
       }
       // 读取到一块立即输出
       fmt.Print(chunk.Content)
    }
    fmt.Println()


    // LLM 没有真正的记忆,多轮对话中,当前消息会和历史消息一起发送给模型
    // 历史消息列表,先放入 System Message
    history := []*schema.Message{
       schema.SystemMessage("你是一个友好的 Go 语言助手,回答简洁,每次不超过 100 字"),
    }

    scanner := bufio.NewScanner(os.Stdin)
    fmt.Println("开始对话(输入 quit 退出):")

    for {
       fmt.Print("\n你: ")
       if !scanner.Scan() {
          break
       }
       input := strings.TrimSpace(scanner.Text())
       if input == "quit" {
          fmt.Println("再见!")
          break
       }
       if input == "" {
          continue
       }
       // 追加 User Message
       history = append(history, schema.UserMessage(input))

       // 每轮对话都使用完整的历史消息列表
       stream, err := chatModel.Stream(ctx, history)
       if err != nil {
          fmt.Println(fmt.Sprintf("调用失败: %v", err))
          continue
       }

       fmt.Print("助手: ")
       var reply strings.Builder
       for {
          chunk, err := stream.Recv()
          if errors.Is(err, io.EOF) {
             break
          }
          if err != nil {
             fmt.Println(fmt.Sprintf("读取失败: %v", err))
             break
          }
          fmt.Print(chunk.Content)
          reply.WriteString(chunk.Content)
       }
       stream.Close()
       fmt.Println()

       // 追加 Assistant Message
       history = append(history, &schema.Message{
          Role:    schema.Assistant,
          Content: reply.String(),
       })
    }
}

参考文章

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇