全网首发!字节跳动 Eino 框架实战:从 0 到 1 打造面试 Agent(含 RAG + 向量检索)

206 阅读3分钟

字节跳动 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,它需要具备以下能力:

  1. 看简历:解析 PDF,提取技能点。
  2. 出题目:根据简历和题库生成问题。
  3. 做评估:判断候选人回答的准确性。

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 中,我们通过 ChainGraph 来组织逻辑。 对于面试这种复杂场景,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?

  1. 大厂背书:字节内部大规模使用的框架,稳定性有保障。
  2. Go 语言红利:目前 Go 生态缺 AI 框架,先掌握的人就是“稀缺人才”。
  3. 工程化体验:如果你习惯了微服务开发,Eino 的开发体验会让你倍感亲切。

五、 源码分享

为了帮助更多 Go 开发者快速上手 Eino,我将这个 【面试吧】 项目的核心代码整理出来了。 包含:

  • Eino Agent 编排源码
  • Milvus RAG 检索源码
  • Redis 异步队列源码
  • Hertz 网关源码

👉 获取方式: 关注公众号【王中阳】,回复“面试吧”,即可获取。

或者在掘金评论区留言“Eino”,我私信发你项目仓库地址。

一起拥抱 AI 工程化的浪潮!