5分钟学会LLM开发系列教程(六)LangChain集成Milvus向量数据库

milvus

  • 下载 docker-compose,本地启动 milvus 服务
sh 复制代码
# Download the configuration file
$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.6/milvus-standalone-docker-compose.yml -O docker-compose.yml

# Start Milvus
$ sudo docker compose up -d

attu 可视化界面

github.com/zilliztech/...

sh 复制代码
docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.5

集合的状态

集合的基本属性包括名称、创建时间和状态,状态分为未加载、已加载和已释放。 副本用于提高可靠性、查询性能和负载均衡,默认情况下只有一个副本。 集合需要加载到内存中才能创建和使用索引,因为Milvus采用内存计算架构。 索引类似于书的目录,帮助快速查找数据,自动选择最适合的索引类型。 度量类型有余弦相似度、欧几里德距离、内积和汉明距离,用于计算向量相似性。

  • 必须先加载load集合到内存中才能使用

    • 采用了内存计算的加载
    • 数据存在磁盘上
    • 但是搜索和索引I需要要内存中进行
    • 加载操作就是把集台数据从磁盘读取内存
  • 集合的生命周期

    • 已创建但未加载 :数据在磁盘中、不可以进行搜索操作不占用内存资源
    • 已加载数据在内存中、可以进行所有的操作占用内存资源
    • 已释放集合数据从内存中释放回到未加载的状态释放内存资源

索引

向量搜索

  1. 支持向量搜索,通过输入向量或实体ID进行搜索,结果按匹配程度排序。
  2. 搜索参数包括TopK(返回最相似的条数)、一致性模式、字段过滤和分组功能。
  • 一致性包括
    1. 强一致性(Strong Consistency)

      • 机制:通过同步复制(所有副本写入完成才返回成功)和分布式事务保证数据的强一致性。
      • 特点:确保任何写入操作完成后,后续读取都能立即获取最新数据,但可能增加延迟。
      • 适用场景:金融、实时推荐等对数据准确性要求极高的场景。
    2. 有界一致性(Bounded Staleness)【一般选择】

      • 机制:允许数据在一定时间或版本范围内存在短暂不一致,但保证最终一致。
      • 特点:通过设置"可容忍的陈旧时间/版本数"平衡性能与一致性。例如,允许数据最多落后 5 秒。
      • 适用场景:高并发写入但允许短暂延迟的场景,如社交媒体的动态推送。
    3. 会话一致性(Session Consistency)

      • 机制:确保同一会话(客户端连接)内的操作能读取到自身写入的最新数据,跨会话可能不一致。
      • 特点:适用于需要用户级一致性的场景,如用户个人数据的实时更新。
    4. 最终一致性(Eventually Consistent)

      • 机制:不保证写入后立即可读,依赖异步复制逐步同步数据。
      • 特点:延迟低但可能读取到旧数据,适合大规模数据分析等对实时性要求不高的场景。
  1. 向量搜索的参数设置包括Level(搜索级别)和Radius(搜索半径),影响搜索的精细程度和结果数量。
  • Level 越小,速度越快,但是损失相似搜索质量
  1. Range filter(范围过滤器)用于进一步筛选搜索结果,结合Radius使用可以查找特定范围内的结果

LangChain 封装 Milvus

  1. LangChain 封装的 milvus 还不够完善,建议增删改,用原生的 Milvus 的api。想要检索查询,集成到 chain中,可以用封装的
js 复制代码
import { MilvusClient } from '@zilliz/milvus2-sdk-node';

this.milvusClient = new MilvusClient({
      address: 'localhost:19530',
      timeout: 5000,
    });
    

  /**
   * 向量插入
   */
  async insert() {
    await this.milvusClient.useDatabase({ db_name: 'test' });
    const data = [
      {
        name: '今天天气真好,大太阳',
        name_vector: await this.embeddingsModel.embedQuery(
          '今天天气真好,大太阳',
        ),
      },
    ];
    const res = await this.milvusClient.insert({
      collection_name: 'art',
      fields_data: data,
    });
    console.log('=>(study.milvus.service.ts 146) res', res);

    // 落库
    // await this.milvusClient.flush({
    //   collection_names: ['art'],
    // });
  }

  /**
   * 插入数据后的搜索
   */
  async searchAfterInsert() {
    await this.milvusClient.useDatabase({ db_name: 'test' });
    const result = await this.milvusClient.search({
      collection_name: 'art',
      // db_name: this.db_name,
      vector: await this.embeddingsModel.embedQuery('你怎样'),
      limit: 2,
      anns_field: 'name_vector',
      output_fields: ['name', 'id'],
    });
    console.log('=>(study.milvus.service.ts 124) result', result);
  }
  • langchain 封装的 milvus
js 复制代码
import { Milvus } from '@langchain/community/vectorstores/milvus';

 /**
   * 使用LangChain Milvus搜索
   */
  async searchWithLangchainMilvus() {
    const vectorStore = new Milvus(this.embeddingsModel, {
      collectionName: 'art',
      vectorField: 'name_vector',
      textField: 'name',
      clientConfig: {
        address: 'localhost:19530',
        timeout: 5000,
        database: 'test',
      },
      indexCreateOptions: {
        index_type: 'IVF_HNSW',
        metric_type: 'COSINE',
      },
    });

    const res = await vectorStore.similaritySearchWithScore('你怎么样', 2);
    console.log('=>(study.milvus.service.ts 190) res', res);
  }

ps:如果大家有疑惑的地方,可以私信咨询我哦~旨在帮助前端er入门生产级别的AI编程

相关推荐
BreezeJiang1 小时前
聊天历史不是越多越好:用 LangChain 把“记住”和“带上”分开
langchain
面向Google编程2 小时前
你把 Claude Code 当聊天框,高手却让它"自己查自己":3 个拉开差距的工程习惯
ai编程·claude
lifallen2 小时前
Skill 的生命周期:问题消失以后
人工智能·学习·ai·ai编程
小虎AI生活4 小时前
两天让 20 多位零基础学员各写出一篇真实文章:一套「IP 启蒙课」的完整拆解
ai编程
七牛云行业应用5 小时前
Harness Engineering 是什么:从“写提示词“到“设计 Agent 边界“的工程方法论
人工智能·agent·ai编程
八角丶7 小时前
Node 网络编程 —— TLS 模块
javascript·后端·node.js
DO_Community8 小时前
AMD旗舰GPU仅需4美元每小时,DigitalOcean上线Spot GPU实例
大数据·人工智能·agent·ai编程
花间相见9 小时前
【LangChain中间件01】—— LangChain 中间件入门:六个钩子让 Agent 可插拔
中间件·langchain
全栈弄潮儿10 小时前
初学者关于 AI 编程最常问的 10 个问题
aigc·openai·ai编程
RAOY的AI笔记10 小时前
Codex注册教程:从账号认证、环境配置到AI编程任务实践
chatgpt·ai编程