11 Go Eino AI应用开发实战 | 基于 Milvus 的向量搜索

78 阅读4分钟

声明:本AI应用开发系列教程首发在同名公众号:王中阳,未经授权禁止转载。

Go-Eino Interview Agent 平台利用 Milvus 作为其向量数据库,为面试相关内容提供语义搜索功能。该全面的向量搜索系统支持文档检索、相似性匹配和智能内容过滤,以增强 AI 驱动的面试体验。

架构概述

向量搜索架构采用分层设计模式,与 Eino 框架无缝集成:

image.png

系统通过 MilvusManager 进行编排,协调所有向量搜索组件,为向量生成、文档索引和语义检索提供统一接口。

核心组件

Milvus Manager

MilvusManager 作为所有向量搜索操作的核心协调器。它管理:

  • Milvus 客户端连接:建立并维护与 Milvus 服务器的连接
  • Embedding Service:使用 Ark 的 embedding 模型处理文本到向量的转换
  • Document Splitter:将文档处理为可搜索的片段
  • Indexer Service:管理文档索引和存储
  • Retriever Service:执行语义搜索查询

Embedding Service

embedding 服务利用 Ark 的 embedding 模型将文本转换为高维向量。主要特性包括:

  • 模型配置:支持可配置维度的自定义 embedding 模型
  • 身份验证:使用 API 密钥或访问/密钥对进行灵活身份验证
  • 批处理:对多个文档进行高效的批量 embedding
  • 错误处理:带有重试机制的全面错误处理

Document Indexer

索引器服务管理文档存储和向量索引。它定义了包含以下字段的集合模式:

  • ID 字段:用于文档标识的主键
  • 向量字段:用于语义相似性匹配的浮点向量
  • 内容字段:文档文本内容
  • 元数据字段:用于过滤和分类的 JSON 元数据

系统使用 COSINE 相似性度量和 AUTOINDEX 以获得最佳搜索性能。

Retrieval Service

检索服务提供灵活的搜索功能:

  • 基础检索:通过查询文本进行简单语义搜索
  • 过滤检索:基于元数据的过滤搜索
  • 多集合支持:跨不同文档集合搜索
  • 自定义表达式:使用 Milvus 表达式语法进行高级过滤

搜索实现

查询处理

搜索过程从使用 embedding 服务对查询进行向量化开始,然后对索引向量执行相似性搜索:

// 向量嵌入和搜索执行
vectors, err := embedder.EmbedStrings(ctx, []string{query})
searchResults, err := client.Search(
    ctx, collectionName, partitions, expr,
    outputFields, []entity.Vector{entity.FloatVector(queryVector)},
    vectorField, metricType, topK, searchParam,
)

过滤选项

系统通过 RetrieveOptions 支持复杂的过滤:

  • 语言过滤:按编程语言过滤(golang、java、middleware)
  • 类别过滤:按文档类型过滤(specialized、comprehensive、basic)
  • 自定义表达式:高级 JSON 字段过滤
  • TopK 控制:可调整的结果数量

过滤表达式使用 Milvus JSON 字段语法构建:

// 示例过滤表达式
metadata['language'] == 'golang' && metadata['category'] == '专项'

工具集成

向量搜索功能通过 MilvusRetrieverTool  暴露,与 Eino 框架集成:

type MilvusRetrieverInput struct {
    Query string `json:"query" description:"要检索的查询文本"`
}

该工具使 AI agents 能够在面试对话中执行语义搜索,检索相关技术文档、面试问题和答案指南。

配置

系统通过 YAML 设置进行配置,包含以下关键参数:

  • Milvus 连接:服务器地址、身份验证和数据库配置
  • Embedding 设置:模型选择、API 凭证和向量维度
  • 文档处理:块大小、重叠和分割参数
  • 搜索参数:TopK 结果、相似性度量和索引类型

系统使用 FloatVector 而非 BinaryVector,以通过 COSINE 距离度量获得更好的语义相似性匹配,这对于基于文本的文档检索是最优的。

性能考虑

  • 向量维度:根据 embedding 模型要求可配置(通常为 1024-4096 维)
  • 索引类型:AUTOINDEX 为不同用例提供自动优化
  • 批处理:支持批量文档索引以实现高效数据摄取
  • 内存管理:通过管理器模式进行适当的连接池和资源清理

检索服务实现了直接的 Milvus SDK 调用以处理复杂的过滤场景,绕过了 Eino 抽象限制,同时保持兼容性。

集成点

向量搜索系统与以下组件集成:

  • Eino 组件架构:利用 Eino 的组件抽象
  • 简历分析 Agent:为简历相关内容提供语义搜索
  • 面试问题生成:检索相关问题模板
  • 答案评估系统:为评估提供参考资料

这种全面的向量搜索实现能够实现智能内容检索,显著增强 AI 面试 agent 在面试交互中提供相关、上下文适当响应的能力。