第一章:Go 语言开发的大模型调用框架 - Eino
·
第一章 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)暂停时间。
更多推荐


所有评论(0)