作为Go开发者,你是否也曾羡慕Python生态里层出不穷的LLM框架?从LangChain到LlamaIndex,Python开发者总能轻松搭起AI应用的骨架。但现在,Go开发者也有了专属的终极解决方案------Eino框架!
Go AI应用开发的进化之路
回顾Go语言在AI领域的应用历程,大致可分为三个阶段:
1. 原生API调用阶段
早期开发者只能直接调用OpenAI等平台的HTTP API,手写请求签名、处理流式响应,代码充斥着大量重复的网络请求逻辑。
go
// 原始API调用示例
func callOpenAI(prompt string) (string, error) {
reqBody := map[string]interface{}{
"model": "gpt-3.5-turbo",
"messages": []map[string]string{
{"role": "user", "content": prompt},
},
}
// 手动处理HTTP请求、签名、序列化...
// 大量模板代码占用开发精力
}
2. 基础工具库阶段
社区出现了一些封装API的工具库,但缺乏统一标准,组件间难以协同,复杂流程编排仍需手动实现。
3. 全功能框架阶段
随着Eino的出现,Go终于有了专为LLM应用设计的完整框架,提供组件化、流程编排、类型安全等企业级能力。
Eino:Go生态的LLM应用开发利器
Eino(发音类似"I know")是CloudWeGo团队推出的Go语言LLM应用开发框架,借鉴了LangChain等框架的优秀思想,同时深度贴合Go语言特性。
它的核心价值在于:
-
标准化组件抽象:模型、工具、检索器等组件即插即用
-
强大的编排能力:处理类型检查、流式响应、并发管理等复杂问题
-
简洁API设计:符合Go开发者的使用习惯
-
丰富最佳实践:内置流程模板和示例代码
-
全生命周期工具:从开发调试到监控评估一应俱全
快速上手:30行代码实现智能问答
让我们用Eino快速实现一个简单的AI问答应用,体验其简洁高效的开发模式。
1. 安装依赖
arduino
go get github.com/cloudwego/eino
go get github.com/cloudwego/eino-ext
2. 基础问答示例
go
package main
import (
"context"
"fmt"
"github.com/cloudwego/eino"
"github.com/cloudwego/eino/components/model"
"github.com/cloudwego/eino-ext/model/openai"
"github.com/cloudwego/eino/schema"
)
func main() {
ctx := context.Background()
// 1. 配置OpenAI模型
config := &openai.ChatConfig{
APIKey: "your-api-key",
Model: "gpt-3.5-turbo",
}
// 2. 创建模型实例
chatModel, err := openai.NewChatModel(ctx, config)
if err != nil {
panic(err)
}
// 3. 生成回答
message, err := chatModel.Generate(ctx, []*schema.Message{
schema.SystemMessage("你是一个Go开发者助手,用简洁的语言回答问题"),
schema.UserMessage("如何用Go实现一个简单的LLM客户端?"),
})
if err != nil {
panic(err)
}
fmt.Println("AI回答:", message.Content)
}
3. 进阶:使用Chain编排复杂流程
当需求变得复杂时,Eino的Chain编排能力就能派上用场。比如实现"提示模板→LLM调用"的流水线:
less
func main() {
ctx := context.Background()
// 1. 创建模型
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatConfig{
APIKey: "your-api-key",
Model: "gpt-3.5-turbo",
})
// 2. 创建提示模板
promptTpl := prompt.FromMessages(
schema.Jinja2,
schema.SystemMessage("你是{{role}},请回答:{{question}}"),
)
// 3. 构建Chain
chain, _ := compose.NewChain[map[string]any, *schema.Message]().
AppendChatTemplate(promptTpl).
AppendChatModel(chatModel).
Compile(ctx)
// 4. 执行Chain
result, _ := chain.Invoke(ctx, map[string]any{
"role": "Go专家",
"question": "Go 1.21版本有哪些重要更新?",
})
fmt.Println(result.Content)
}
4. 工具调用示例
Eino内置了工具调用能力,让AI可以调用外部函数获取信息:
go
// 定义一个天气查询工具
type WeatherTool struct{}
func (w *WeatherTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "get_weather",
Desc: "查询指定城市的天气",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"city": {
Desc: "城市名称",
Required: true,
Type: schema.String,
},
}),
}, nil
}
func (w *WeatherTool) InvokableRun(ctx context.Context, args string) (string, error) {
// 实际实现调用天气API的逻辑
return fmt.Sprintf("城市%s的天气是晴朗,25℃", args), nil
}
// 在Agent中使用工具
func main() {
ctx := context.Background()
// 创建模型
model, _ := openai.NewChatModel(ctx, &openai.ChatConfig{
APIKey: "your-api-key",
})
// 创建工具
weatherTool := &WeatherTool{}
// 配置Agent
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "weather_agent",
Description: "查询天气的智能助手",
Model: model,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.Tool{weatherTool},
},
},
})
// 运行Agent
input := &adk.AgentInput{
Messages: []*schema.Message{
schema.UserMessage("北京今天的天气怎么样?"),
},
}
iter := agent.Run(ctx, input)
for iter.Next(ctx) {
event := iter.Value()
if event.Output != nil && event.Output.MessageOutput != nil {
msg, _ := event.Output.MessageOutput.GetMessage()
fmt.Println("AI回复:", msg.Content)
}
}
}
Eino框架架构解析
Eino采用模块化设计,主要包含以下部分:
-
核心框架(eino) :类型定义、流处理、组件抽象、编排功能
-
扩展组件(eino-ext) :各类组件的具体实现,如OpenAI模型、工具等
-
DevOps工具:可视化开发、调试工具
-
示例代码(eino-examples) :最佳实践参考
这种架构让开发者可以根据需求灵活选择组件,同时保证了框架的可扩展性。
为什么选择Eino?
-
类型安全:Go的静态类型特性结合Eino的类型检查,减少运行时错误
-
性能优势:Go的并发模型特别适合处理LLM的流式响应
-
企业级支持:CloudWeGo团队背书,适合生产环境使用
-
生态融合:可与Kitex、Hertz等CloudWeGo项目无缝集成
-
持续迭代:活跃的开发团队不断优化功能
开始使用Eino
如果你是Go开发者,想要快速构建可靠的LLM应用,Eino绝对值得一试。现在就克隆仓库,开始你的Go AI开发之旅吧!
欢迎在评论区分享你用Go开发AI应用的经验,或者对Eino框架的期待~