第一章 Eino 简介

1. 什么是Eino

Eino[‘aino] (近似音: i know,希望框架能达到 “i know” 的愿景) 旨在提供基于 Go 语言的终极大模型应用开发框架。 它从开源社区中的诸多优秀 LLM 应用开发框架,如 LangChain 和 LlamaIndex 等获取灵感,同时借鉴前沿研究成果与实际应用,提供了一个强调简洁性、可扩展性、可靠性与有效性,且更符合 Go 语言编程惯例的 LLM 应用开发框架。

Eino 提供的价值如下:

  • 精心整理的一系列 组件(component) 抽象与实现,可轻松复用与组合,用于构建 LLM 应用。
  • 智能体开发套件(ADK),提供构建 AI 智能体的高级抽象,支持多智能体编排、人机协作中断机制以及预置的智能体模式。
  • 强大的 编排(orchestration) 框架,为用户承担繁重的类型检查、流式处理、并发管理、切面注入、选项赋值等工作。
  • 一套精心设计、注重简洁明了的 API
  • 以集成 流程(flow)示例(example) 形式不断扩充的最佳实践集合。
  • 一套实用 工具(DevOps tools),涵盖从可视化开发与调试到在线追踪与评估的整个开发生命周期。

借助上述能力和工具,Eino 能够在人工智能应用开发生命周期的不同阶段实现标准化、简化操作并提高效率:

第二章 大模型调用及提示词

1. 大模型调用示例

package main

import (
	"context"
	"fmt"
	"github.com/cloudwego/eino/schema"
	"log"
	"os"
	"study"

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

func main() {
	ctx := context.Background()

	// 调用大模型
	llm, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
		APIKey:  os.Getenv("MODELSCOPE_ACCESS_TOKEN"), // api_key
		BaseURL: study.BASE_URL,  // 模型的openai兼容下的 url
		Model:   study.BASE_MODEL, // 大模型
	})
	if err != nil {
		log.Fatalf("调用模型失败:%v", err)
	}

	// 定义提示词
	messages := []*schema.Message{
		schema.SystemMessage("你是一个Go语言助手,回答问题简洁专业,字数不超过100。"),
		schema.UserMessage("介绍下Go语言相比于Python语言有哪些优势?"),
	}

	// 调用大模型进行回复
	resp, err := llm.Generate(ctx, messages)
	if err != nil {
		log.Printf("调用模型回复失败:%v", err)
	}

	fmt.Println("助手回复:", resp.Content)
}

回复结果:

助手回复: Go 编译执行,性能远超 Python。原生协程无 GIL 限制,高并发能力更强。静态类型保障编译安全,部署仅需二进制,无需环境依赖。适用于高性能后端,Python 胜在开发效率。

2. 提示词模板定义

在实际应用开发过程中,提示词模板并不是固定不变的。如何动态生成提示词模板是学习的关键。以下是动态提示词模板的生成示例:

package main

import (
	"context"
	"fmt"
	"github.com/cloudwego/eino/components/prompt"
	"github.com/cloudwego/eino/schema"
	"log"
	"os"
	"study"

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

func main() {
	ctx := context.Background()

	// 调用大模型
	llm, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
		APIKey:  os.Getenv("MODELSCOPE_ACCESS_TOKEN"),
		BaseURL: study.BASE_URL,
		Model:   study.BASE_MODEL,
	})
	if err != nil {
		log.Fatalf("调用模型失败:%v", err)
	}

	// 定义提示词模板
	tpl := prompt.FromMessages(
		schema.FString,
		schema.SystemMessage("你是一个{role},回答问题简洁专业。"),  
		schema.UserMessage("{question}"),
	)

	// 格式化
	messages, err := tpl.Format(ctx, map[string]any{
		"role":     "Go语言助手",
		"question": "为什么说Go语言天然支持高并发?",
	})
	if err != nil {
		return
	}

	// 调用大模型进行回复
	resp, err := llm.Generate(ctx, messages)
	if err != nil {
		log.Printf("调用模型回复失败:%v", err)
	}

	fmt.Println("助手回复:", resp.Content)
}

回复结果:

助手回复: Go 语言天然支持高并发,核心在于其运行时(Runtime)与设计哲学的深度优化:

1.  **轻量级 Goroutine**
    *   初始栈仅需 2KB,支持动态伸缩。
    *   相比 OS 线程,创建与上下文切换成本极低,单节点可轻松支撑数百万并发任务。

2.  **高效的 GMP 调度模型**
    *   **G** (Goroutine) + **M** (Machine/OS Thread) + **P** (Processor)。
    *   Runtime 在用户态管理协程调度,实现多对多映射、工作窃取(Work Stealing)及抢占式调度,最大化 CPU 利用率。

3.  **CSP 并发模型 (Channels)**
    *   遵循“不要通过共享内存来通信,而应通过通信来共享内存”。
    *   内建 Channel 提供安全的并发通信原语,简化了复杂逻辑下的状态同步,降低死锁与竞态条件风险。

4.  **内置同步原语与 GC 优化**
    *   `sync` 包提供高效互斥锁与原子操作。
    *   GC 针对并发场景优化(如三色标记法、写屏障),显著减少 STW(Stop-The-World)暂停时间。

更多推荐