字节跳动 CloudWeGo 团队近期开源了 Eino 框架,填补了 Go 语言在 AI Agent 编排领域的空白。
作为一名 Go 开发者,如何利用 Eino 快速构建一个企业级的 AI 应用?本文将通过一个已开源的面试 Agent 平台,深度解析 Eino 的 Graph 编排、Tool Use 工具调用以及 RAG 知识库检索等核心特性。
一、 Eino 框架初体验:Go 终于有自己的 LangChain 了
长期以来,Go 语言在 AI 应用层一直处于“缺腿”状态。
- LangChain (Python/JS):生态丰富,但并发性能差,工程化弱。
- Go 生态:只有零散的
go-openai库,缺乏系统的 Agent 编排框架。
Eino 的出现改变了局面。 它沿袭了 CloudWeGo 一贯的高性能、强类型、微服务亲和的特点。
- 组件化:Model, Prompt, Tool, Memory 都是标准组件。
- 图编排:通过 Graph 定义复杂的业务流转,逻辑可视化。
二、 项目实战:AI 面试官的诞生
为了验证 Eino 的能力,我开发了 【面试吧】 项目。 这是一个模拟真实面试的 Agent,它需要具备以下能力:
- 看简历:解析 PDF,提取技能点。
- 出题目:根据简历和题库生成问题。
- 做评估:判断候选人回答的准确性。
2.1 核心依赖
require (
github.com/cloudwego/eino v0.0.0-2024xxx
github.com/cloudwego/hertz v0.8.0
github.com/milvus-io/milvus-sdk-go/v2 v2.3.0
)
2.2 定义 Agent Graph(核心代码)
在 Eino 中,我们通过 Chain 或 Graph 来组织逻辑。 对于面试这种复杂场景,Graph 是最佳选择。
// backend/chatApp/agent/interview/comprehensive/school_comprehensive_agent.go
// 1. 创建 ChatModel(大模型组件)
model, _ := chat.CreatOpenAiChatModel(ctx, userId)
// 2. 创建 Tool(简历解析工具)
resumeTool := tool2.GetResumeInfoTool()
// 3. 组装 Agent
// Eino 提供了 NewChatModelAgent 高级封装,内置了 ReAct 循环
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "Interviewer",
Description: "基于 Eino 的智能面试官",
Model: model,
// 工具配置:Eino 会自动处理 Tool Call 的参数解析与回填
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []componenttool.BaseTool{resumeTool},
},
},
// 状态管理:设置最大对话轮数
MaxIterations: 15,
})
解析:
adk.NewChatModelAgent:这是 Eino 的高阶 API,它帮我们封装了 "User -> Model -> Tool -> Model -> User" 的复杂 ReAct 循环。我们只需要关注业务逻辑。
三、 RAG 进阶:Milvus 向量检索实战
面试官不能瞎问,必须基于题库。 我们使用了 Milvus 作为向量数据库,并实现了一个自定义的 Retriever。
3.1 向量化与存储
我们编写了一个 importer,将 Markdown 格式的题库切分(Chunking),调用 Embedding 模型向量化,然后存入 Milvus。
3.2 检索实现(Retriever)
// backend/internal/eino/milvus/retrieval/retriever.go
func (s *RetrieverService) Retrieve(ctx context.Context, query string, opts ...Option) ([]*schema.Document, error) {
// 1. 参数解析
options := s.parseOptions(opts...)
// 2. 混合检索(Hybrid Search)
// 结合了 Filter(标量过滤)和 Vector Search(向量相似度)
searchParam, _ := entity.NewIndexAUTOINDEXSearchParam(1)
result, err := s.client.Search(ctx,
s.config.Collection,
[]string{},
expr, // 过滤表达式,例如:language == 'Go'
[]string{"content"},
vectors,
s.config.VectorField,
milvus.NewTopKMetricType(milvus.L2, 3),
searchParam,
)
// 3. 结果组装
// 将 Milvus 结果转换为 Eino 标准的 schema.Document
return s.convertToDocuments(result)
}
价值:通过实现 Eino 的 Retriever 接口,我们的 Milvus 检索服务可以无缝嵌入到任何 Eino Agent 中,实现了组件的可复用性。
四、 为什么推荐你学 Eino?
- 大厂背书:字节内部大规模使用的框架,稳定性有保障。
- Go 语言红利:目前 Go 生态缺 AI 框架,先掌握的人就是“稀缺人才”。
- 工程化体验:如果你习惯了微服务开发,Eino 的开发体验会让你倍感亲切。
五、 源码分享
为了帮助更多 Go 开发者快速上手 Eino,我将这个 【面试吧】 项目的核心代码整理出来了。 包含:
- Eino Agent 编排源码
- Milvus RAG 检索源码
- Redis 异步队列源码
- Hertz 网关源码
👉 获取方式: 关注公众号【王中阳】,回复“面试吧”,即可获取。
或者在掘金评论区留言“Eino”,我私信发你项目仓库地址。
一起拥抱 AI 工程化的浪潮!