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编程

相关推荐
可乐爱宅着4 分钟前
使用docker部署nestjs应用
node.js
没事别学JAVA10 分钟前
vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm
vue.js·node.js·vue
菜鸟码农_Shi1 小时前
Node.js 如何实现 GitHub 登录(OAuth 2.0)
javascript·node.js
陈明勇2 小时前
MCP 协议更新详解:从 HTTP+SSE 到 Streamable HTTP
人工智能·ai编程·mcp
用户4099322502122 小时前
FastAPI与SQLAlchemy数据库集成与CRUD操作
后端·ai编程·trae
懋学的前端攻城狮3 小时前
分布式Node.js--03-扩展
javascript·后端·node.js
架构精进之路4 小时前
Deepseek 这么厉害,普通人怎么用好它?
后端·langchain·ai编程
QTX187305 小时前
使用 Axios 进行 API 请求与接口封装
javascript·vue.js·node.js
cv也要开心5 小时前
超越界限:AI技术融合 - Agent、RAG、Function Call与MCP
ai编程·mcp