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

相关推荐
BD_Marathon4 小时前
调用DeesSeek官网的DeepSeek模型
langchain
颜进强4 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
VIP_CQCRE4 小时前
把 OpenCode 接入 Ace Data Cloud:让 VS Code、Cursor、Windsurf 统一调用 AI 编程模型
vscode·大模型·ai编程·opencode·acedatacloud
郑州光合科技余经理6 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
三水写代码6 小时前
手写一个 Claude Code(1):从 Agent Loop 到工具、权限、Hooks 与任务规划
python·ai编程·claude·ai agent·claudecode
AI砖家7 小时前
Claude Code Skill 质量检查实战:用 /skill-doctor + Plugin Evals 找出“看似能用、实际没被调用“的问题
人工智能·ai编程·claude·codex·skill
anda01098 小时前
A2UI 协议: AI 直接画界面,而不是只会打字
人工智能·ai编程
用户21578283966338 小时前
AI 写了 7300 行 MoonBit:编译器能验的,和验不了的
ai编程
正在走向自律9 小时前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十