008-01:RAG 入門-向量存儲(chǔ)與企業(yè)級(jí)向量數(shù)據(jù)庫 milvus

本文是 refine-rag 系列教程的第八篇,我們來學(xué)習(xí)向量存儲(chǔ)的核心技術(shù)和 Milvus 數(shù)據(jù)庫的使用。
本文所有代碼都在:https://github.com/zonezoen/refine-rag

往期系列文章

目錄

  • 前言
  • 為什么傳統(tǒng)數(shù)據(jù)庫搞不定向量搜索?
  • 向量數(shù)據(jù)庫橫向?qū)Ρ?/li>
  • 為什么選擇 Milvus?
  • 快速搭建 Milvus
  • Milvus 核心概念
  • 實(shí)戰(zhàn)示例
  • 學(xué)習(xí)路徑

前言

前面我們學(xué)習(xí)了向量嵌入與檢索,知道如何把文本轉(zhuǎn)成向量、如何計(jì)算相似度。但有個(gè)問題:這些向量存在哪里?

如果只有幾千條數(shù)據(jù),存在內(nèi)存里就夠了。但如果有幾百萬、幾千萬條數(shù)據(jù)呢?這時(shí)候就需要專業(yè)的向量數(shù)據(jù)庫。

向量數(shù)據(jù)庫就像是為向量量身定制的"倉庫管理系統(tǒng)",它不僅能存儲(chǔ)海量向量,還能快速檢索、高效管理。

為什么傳統(tǒng)數(shù)據(jù)庫搞不定向量搜索?

上一篇文章提到,向量本質(zhì)上是一個(gè)浮點(diǎn)數(shù)數(shù)組,是機(jī)器理解文本語義的方式。

你可能會(huì)想:既然向量就是數(shù)組,那我存進(jìn) MySQL 的 JSON 字段或者直接存在內(nèi)存 List 里不行嗎?

答案是:小規(guī)??梢?,大規(guī)模必死。

當(dāng)你的知識(shí)庫達(dá)到萬級(jí)、百萬級(jí)甚至億級(jí)時(shí),你會(huì)面臨:

  1. 檢索效率塌方(計(jì)算量過大)
    傳統(tǒng)數(shù)據(jù)庫查找數(shù)據(jù)是“相等判斷”,而向量搜索需要計(jì)算空間距離。如果你有 100 萬條數(shù)據(jù),每搜一次都要全表掃一遍并計(jì)算相似度O(n) 復(fù)雜,查詢一次可能要幾秒甚至幾分鐘。向量數(shù)據(jù)庫通過 ANN(近似最近鄰)算法(如 HNSW),將搜索效率提升到了毫秒級(jí)O(log n) 復(fù)雜度。
  2. 維度災(zāi)難(內(nèi)存壓力)
    一個(gè) 1536 維的向量(OpenAI 標(biāo)準(zhǔn))看起來不大,但幾百萬條疊在一起,會(huì)瞬間撐爆普通的服務(wù)器內(nèi)存。向量數(shù)據(jù)庫專門優(yōu)化了數(shù)據(jù)的壓縮與加載策略。
  3. 工程化缺失
    向量數(shù)據(jù)庫不僅僅是“存數(shù)據(jù)”,它還提供了成熟的 CRUD、多租戶隔離、數(shù)據(jù)備份和水平擴(kuò)展(Scale-out)能力,這些是簡單的內(nèi)存庫(如 FAISS)難以勝任的。

核心對(duì)比:傳統(tǒng)數(shù)據(jù)庫 vs 向量數(shù)據(jù)庫

傳統(tǒng)數(shù)據(jù)庫查找的是精準(zhǔn)的數(shù)據(jù),而向量數(shù)據(jù)庫則更適合模糊搜索。

  • 傳統(tǒng)數(shù)據(jù)庫 (MySQL)
    • 你問:“有沒有編號(hào)為 1024 的商品?”他秒回。
    • 你問:“有沒有長得像蘋果的手機(jī)?”他直接罷工”。
  • 向量數(shù)據(jù)庫 (Milvus)
    • 他會(huì)把所有數(shù)據(jù)轉(zhuǎn)化為空間坐標(biāo),告訴你:“雖然我沒找到完全一樣的,但有幾個(gè)神似的數(shù)據(jù)。”

代碼層面的直觀感受

傳統(tǒng)數(shù)據(jù)庫(MySQL):側(cè)重“準(zhǔn)”

-- 精確查詢:差一個(gè)字都搜不到
SELECT * FROM products WHERE category = '手機(jī)' AND brand = '蘋果';

-- 范圍查詢:基于確定的數(shù)值邊界
SELECT * FROM products WHERE price BETWEEN 5000 AND 8000;
  • 特點(diǎn):擅長精確匹配,基于 B-Tree 索引,查詢條件極其明確(非黑即白)。

向量數(shù)據(jù)庫(Milvus):側(cè)重“像”

# 相似度查詢:基于“語義距離”
results = client.search(
    collection_name="products",
    data=[query_vector],  # 搜索“長得像蘋果的手機(jī)”對(duì)應(yīng)的向量
    limit=10
)
  • 特點(diǎn):擅長模糊搜索,基于向量索引(HNSW、IVF),返回的是 Top-K 個(gè)“最相似”的候選者。

向量數(shù)據(jù)庫橫向?qū)Ρ?/h2>

目前主流的向量數(shù)據(jù)庫有很多,我們來對(duì)比一下:

主流向量數(shù)據(jù)庫對(duì)比

數(shù)據(jù)庫 類型 開源 部署方式 性能 生態(tài) 推薦度
Milvus 專業(yè)向量庫 本地/云 5/5 5/5 5/5
Qdrant 專業(yè)向量庫 本地/云 4/5 4/5 4/5
Weaviate 專業(yè)向量庫 本地/云 4/5 4/5 4/5
Pinecone 云服務(wù) 僅云 5/5 4/5 3/5
Chroma 輕量級(jí) 本地 3/5 3/5 3/5
FAISS 庫(非數(shù)據(jù)庫) 本地 5/5 3/5 3/5
pgvector PostgreSQL 插件 本地/云 3/5 4/5 3/5

詳細(xì)對(duì)比

1. Milvus

優(yōu)點(diǎn):

  • 性能強(qiáng)大,支持億級(jí)向量
  • 索引算法豐富(HNSW、IVF、DiskANN)
  • 支持混合檢索(向量 + 標(biāo)量過濾)
  • 云原生架構(gòu),易擴(kuò)展
  • 社區(qū)活躍,文檔完善
  • 國內(nèi)團(tuán)隊(duì)開發(fā),中文支持好

缺點(diǎn):

  • 部署稍復(fù)雜(需要 etcd、MinIO)
  • 資源占用較高

適用場景:

  • 生產(chǎn)環(huán)境
  • 大規(guī)模數(shù)據(jù)(建議百萬級(jí)以上使用)
  • 需要高性能和穩(wěn)定性

2. Qdrant

優(yōu)點(diǎn):

  • Rust 編寫,性能優(yōu)秀
  • 部署簡單(單二進(jìn)制文件)
  • API 設(shè)計(jì)優(yōu)雅
  • 支持 payload 過濾

缺點(diǎn):

  • 社區(qū)相對(duì)較小
  • 中文文檔較少
  • 大規(guī)模數(shù)據(jù)性能不如 Milvus

適用場景:

  • 中小規(guī)模項(xiàng)目
  • 快速原型開發(fā)
  • 喜歡 Rust 生態(tài)

3. Weaviate

優(yōu)點(diǎn):

  • 內(nèi)置 GraphQL API
  • 支持多模態(tài)搜索
  • 自帶向量化模塊
  • 語義搜索能力強(qiáng)

缺點(diǎn):

  • 學(xué)習(xí)曲線陡峭
  • 資源占用高
  • 配置復(fù)雜

適用場景:

  • 知識(shí)圖譜應(yīng)用
  • 多模態(tài)搜索
  • 需要 GraphQL

4. Pinecone

優(yōu)點(diǎn):

  • 完全托管,無需運(yùn)維
  • 性能優(yōu)秀
  • 易用性好

缺點(diǎn):

  • 閉源,不可自部署
  • 費(fèi)用較高
  • 數(shù)據(jù)在國外(延遲問題)

適用場景:

  • 不想自己運(yùn)維
  • 預(yù)算充足
  • 海外用戶

5. Chroma

優(yōu)點(diǎn):

  • 極簡設(shè)計(jì),易上手
  • 輕量級(jí),適合開發(fā)
  • 與 LangChain 集成好

缺點(diǎn):

  • 性能一般
  • 不適合大規(guī)模生產(chǎn)
  • 功能相對(duì)簡單

適用場景:

  • 學(xué)習(xí)和原型開發(fā)
  • 小規(guī)模應(yīng)用(<10 萬條)
  • 快速驗(yàn)證想法

6. FAISS

優(yōu)點(diǎn):

  • Facebook 出品,算法先進(jìn)
  • 性能極強(qiáng)
  • 支持 GPU 加速

缺點(diǎn):

  • 不是數(shù)據(jù)庫,只是庫
  • 沒有持久化(需自己實(shí)現(xiàn))
  • 沒有分布式支持

適用場景:

  • 研究和實(shí)驗(yàn)
  • 需要 GPU 加速
  • 自己實(shí)現(xiàn)存儲(chǔ)層

7. pgvector

優(yōu)點(diǎn):

  • PostgreSQL 插件,易集成
  • 利用現(xiàn)有 PG 生態(tài)
  • 事務(wù)支持

缺點(diǎn):

  • 性能不如專業(yè)向量庫
  • 索引算法有限
  • 大規(guī)模數(shù)據(jù)吃力

適用場景:

  • 已有 PostgreSQL
  • 數(shù)據(jù)量不大(<100 萬)
  • 需要事務(wù)支持

為什么選擇 Milvus?

綜合考慮,選擇 Milvus 作為本教程的向量數(shù)據(jù)庫,原因如下:

1. 性能強(qiáng)大

# Milvus 可以輕松處理億級(jí)向量
# 查詢延遲:毫秒級(jí)
# QPS:數(shù)千到數(shù)萬

2. 索引算法豐富

索引類型 適用場景 性能
FLAT 小數(shù)據(jù)集,完美準(zhǔn)確率 2/5
IVF_FLAT 中等數(shù)據(jù)集,平衡 4/5
IVF_PQ 大數(shù)據(jù)集,內(nèi)存受限 4/5
HNSW 高性能查詢 5/5
DiskANN 超大規(guī)模,磁盤存儲(chǔ) 4/5

3. 功能完善

  • 混合檢索(向量 + 標(biāo)量過濾)
  • 分區(qū)管理(Partition)
  • 多租戶支持(Database)
  • 動(dòng)態(tài)字段(Dynamic Field)
  • 全文檢索(BM25)
  • 范圍搜索(Range Search)
  • 分組搜索(Group Search)

4. 生態(tài)完善

# 與主流框架無縫集成
from langchain_milvus import Milvus
from llama_index.vector_stores import MilvusVectorStore

5. 國內(nèi)支持好

  • 中文文檔完善
  • 社區(qū)活躍(國內(nèi)團(tuán)隊(duì))
  • 國內(nèi)訪問速度快
  • 技術(shù)支持響應(yīng)快

6. 云原生架構(gòu)

Milvus 架構(gòu):
┌─────────────────────────────────────┐
│         Milvus Coordinator          │  協(xié)調(diào)層
├─────────────────────────────────────┤
│  Query Node  │  Data Node  │ Index  │  計(jì)算層
├─────────────────────────────────────┤
│    etcd    │    MinIO    │  Pulsar │  存儲(chǔ)層
└─────────────────────────────────────┘
  • 存儲(chǔ)計(jì)算分離
  • 易于水平擴(kuò)展
  • 高可用性

7. 面試

現(xiàn)在很多企業(yè)也是用的這套方案,我們學(xué)習(xí)這些不就是奔著找工作去的嗎?直接朝著目標(biāo)前進(jìn)不好嗎?

快速搭建 Milvus

Docker Compose(推薦)

文件:docker-compose.yml

version: "3.8"

services:
  # ----------------------------------------------------------------
  # 1. etcd - 元數(shù)據(jù)存儲(chǔ)
  # ----------------------------------------------------------------
  etcd:
    image: quay.io/coreos/etcd:v3.5.5
    container_name: milvus-etcd
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ./milvus_data/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  # ----------------------------------------------------------------
  # 2. MinIO - 對(duì)象存儲(chǔ)
  # ----------------------------------------------------------------
  minio:
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    container_name: milvus-minio
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - ./milvus_data/minio:/minio_data
    command: minio server /minio_data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  # ----------------------------------------------------------------
  # 3. Milvus Standalone - 向量數(shù)據(jù)庫
  # ----------------------------------------------------------------
  milvus-standalone:
    image: milvusdb/milvus:v2.5.4
    container_name: milvus-standalone
    command: ["milvus", "run", "standalone"]
    security_opt:
      - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
      # ----------------------------------------------------------------
      # 開啟認(rèn)證(設(shè)置密碼)
      # ----------------------------------------------------------------
      # 取消下面兩行注釋即可開啟用戶認(rèn)證
      # COMMON_SECURITY_AUTHORIZATIONENABLED: "true"  # 開啟認(rèn)證
      # COMMON_SECURITY_DEFAULTROOTPASSWORD: "your_password_here"  # 設(shè)置 root 用戶密碼
      # 
      # 開啟后,Python 連接時(shí)需要提供 token:
      # client = MilvusClient(
      #     uri="http://localhost:19530",
      #     token="root:your_password_here"
      # )
    volumes:
      - ./milvus_data/milvus:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "minio"

啟動(dòng)步驟

# 1. 進(jìn)入目錄
cd rag/08-向量存儲(chǔ)/

# 2. 啟動(dòng)所有服務(wù)
docker compose up -d

# 3. 查看服務(wù)狀態(tài)
docker compose ps

# 4. 查看日志(等待啟動(dòng)完成)
docker compose logs -f milvus-standalone

# 看到這行說明啟動(dòng)成功:
# [INFO] Milvus Proxy successfully started

驗(yàn)證安裝

from pymilvus import MilvusClient

# 連接 Milvus
client = MilvusClient(uri="http://localhost:19530")

# 列出數(shù)據(jù)庫
databases = client.list_databases()
print("數(shù)據(jù)庫列表:", databases)  # ['default']

print("? Milvus 連接成功!")

停止服務(wù)

# 停止服務(wù)(保留數(shù)據(jù))
docker compose stop

# 停止并刪除容器(保留數(shù)據(jù))
docker compose down

# 停止并刪除所有數(shù)據(jù)
docker compose down -v
rm -rf milvus_data/

服務(wù)端口說明

服務(wù) 端口 說明
Milvus 19530 gRPC 接口(主要)
Milvus 9091 HTTP 監(jiān)控接口
MinIO 9000 對(duì)象存儲(chǔ) API
MinIO 9001 Web 控制臺(tái)
etcd 2379 元數(shù)據(jù)存儲(chǔ)

訪問 MinIO 控制臺(tái)

瀏覽器打開:http://localhost:9001

  • 用戶名:minioadmin
  • 密碼:minioadmin

可以看到 Milvus 存儲(chǔ)的向量數(shù)據(jù)。

Milvus 核心概念

1. Database(數(shù)據(jù)庫)

類比:圖書館的不同樓層

# 創(chuàng)建數(shù)據(jù)庫
client.create_database(db_name="my_rag_system")

# 切換數(shù)據(jù)庫
client.use_database(db_name="my_rag_system")

# 列出所有數(shù)據(jù)庫
databases = client.list_databases()

用途:

  • 隔離不同業(yè)務(wù)
  • 多租戶管理

2. Collection(集合)

類比:圖書館的書架

# 創(chuàng)建集合(快速模式)
client.create_collection(
    collection_name="documents",
    dimension=128  # 向量維度
)

特點(diǎn):

  • 必須包含向量字段
  • 類似 MySQL 的表

3. Schema(表結(jié)構(gòu))

類比:書籍的目錄格式

from pymilvus import CollectionSchema, FieldSchema, DataType

# 定義字段
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=1000),
    FieldSchema(name="source", dtype=DataType.VARCHAR, max_length=100),
]

# 創(chuàng)建 Schema
schema = CollectionSchema(
    fields=fields,
    description="文檔集合",
    enable_dynamic_field=True  # 允許動(dòng)態(tài)字段
)

# 創(chuàng)建集合
client.create_collection(
    collection_name="documents",
    schema=schema
)

4. Partition(分區(qū))

類比:書架的不同層

# 創(chuàng)建分區(qū)
client.create_partition(
    collection_name="documents",
    partition_name="tech_docs"
)

# 插入數(shù)據(jù)到指定分區(qū)
client.insert(
    collection_name="documents",
    data=[...],
    partition_name="tech_docs"
)

# 只在指定分區(qū)搜索(速度更快)
results = client.search(
    collection_name="documents",
    data=[query_vector],
    partition_names=["tech_docs"]
)

優(yōu)勢:

  • 提高搜索速度
  • 方便數(shù)據(jù)管理
  • 節(jié)省內(nèi)存

5. Index(索引)

后續(xù)的文章會(huì)介紹如何選擇索引類型和距離度量方式。

類比:圖書館的索引系統(tǒng)

# 創(chuàng)建索引
index_params = client.prepare_index_params()
index_params.add_index(
    field_name="vector",
    index_type="HNSW",  # 索引類型
    metric_type="L2",   # 距離度量
    params={
        "M": 16,
        "efConstruction": 200
    }
)

client.create_index(
    collection_name="documents",
    index_params=index_params
)

常用索引:

  • FLAT:小數(shù)據(jù)集,暴力搜索
  • IVF_FLAT:中等數(shù)據(jù)集
  • HNSW:高性能
  • DiskANN:超大規(guī)模

6. Load/Release(加載/釋放)

類比:從倉庫搬到閱覽室

# 加載到內(nèi)存(必須?。?client.load_collection(collection_name="documents")

# 查詢(從內(nèi)存讀取,快)
results = client.search(...)

# 釋放內(nèi)存
client.release_collection(collection_name="documents")

為什么需要 load?

  • 向量搜索需要大量計(jì)算
  • 從內(nèi)存讀取比磁盤快 100 倍
  • 兼顧持久化和性能

實(shí)戰(zhàn)示例

完整示例:黑神話悟空妖怪?jǐn)?shù)據(jù)庫

文件:a-working-sample.py

import logging
import pandas as pd
from pymilvus import MilvusClient, DataType, FieldSchema, CollectionSchema
from sentence_transformers import SentenceTransformer
from tqdm import tqdm

# 隱藏日志
logging.getLogger("pymilvus").setLevel(logging.CRITICAL)

# ——————————————
# 1. 準(zhǔn)備數(shù)據(jù)
# ——————————————
data_records = [
    {
        "monster_id": "BM001",
        "monster_name": "虎先鋒",
        "location": "竹林關(guān)隘",
        "difficulty": "High",
        "synonyms": "猛虎妖, 虎妖",
        "description": "在竹林關(guān)卡中出現(xiàn)的猛虎型妖怪,力量強(qiáng)大。"
    },
    {
        "monster_id": "BM002",
        "monster_name": "火猿",
        "location": "火山洞窟",
        "difficulty": "Low",
        "synonyms": "烈焰猿, 炎猿",
        "description": "生活在火山洞窟的猿類妖怪,只是插科打諢的小兵。"
    },
]
df = pd.DataFrame(data_records)

# ——————————————
# 2. 連接 Milvus
# ——————————————
client = MilvusClient(uri="http://localhost:19530")
collection_name = "Wukong_Monsters"

# ——————————————
# 3. 加載 Embedding 模型
# ——————————————
print("加載 embedding 模型...")
embedding_model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
sample_embedding = embedding_model.encode(["示例文本"])[0]
vector_dim = len(sample_embedding)
print(f"向量維度: {vector_dim}")

# ——————————————
# 4. 定義 Schema 并創(chuàng)建集合
# ——————————————
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=vector_dim),
    FieldSchema(name="monster_id", dtype=DataType.VARCHAR, max_length=50),
    FieldSchema(name="monster_name", dtype=DataType.VARCHAR, max_length=100),
    FieldSchema(name="location", dtype=DataType.VARCHAR, max_length=100),
    FieldSchema(name="difficulty", dtype=DataType.VARCHAR, max_length=20),
    FieldSchema(name="synonyms", dtype=DataType.VARCHAR, max_length=200),
    FieldSchema(name="description", dtype=DataType.VARCHAR, max_length=500),
]

schema = CollectionSchema(
    fields,
    description="Wukong Monsters",
    enable_dynamic_field=True
)

if not client.has_collection(collection_name):
    client.create_collection(collection_name=collection_name, schema=schema)

# ——————————————
# 5. 創(chuàng)建索引
# ——————————————
index_params = client.prepare_index_params()
index_params.add_index(
    field_name="vector",
    index_type="AUTOINDEX",
    metric_type="L2"
)
client.create_index(collection_name=collection_name, index_params=index_params)

# ——————————————
# 6. 插入數(shù)據(jù)
# ——————————————
for start_idx in tqdm(range(len(df)), desc="插入數(shù)據(jù)"):
    row = df.iloc[start_idx]
    
    # 準(zhǔn)備向量文本
    doc_parts = [str(row['monster_name'])]
    if row['synonyms']:
        doc_parts.append(f"(別名:{row['synonyms']})")
    if row['location']:
        doc_parts.append(f"場景:{row['location']}")
    if row['description']:
        doc_parts.append(f"描述:{row['description']}")
    doc_text = ";".join(doc_parts)
    
    # 生成向量
    embedding = embedding_model.encode([doc_text])[0]
    
    # 插入數(shù)據(jù)
    data_to_insert = [{
        "vector": embedding.tolist(),
        "monster_id": str(row["monster_id"]),
        "monster_name": str(row["monster_name"]),
        "location": str(row["location"]),
        "difficulty": str(row["difficulty"]),
        "synonyms": str(row["synonyms"]),
        "description": str(row["description"])
    }]
    
    client.insert(collection_name=collection_name, data=data_to_insert)

# ——————————————
# 7. 加載到內(nèi)存
# ——————————————
print("\n加載 Collection 到內(nèi)存...")
client.load_collection(collection_name=collection_name)
print("? Collection 已加載")

# ——————————————
# 8. 向量搜索
# ——————————————
search_query = "高難度妖怪"
search_embedding = embedding_model.encode([search_query])[0]

search_result = client.search(
    collection_name=collection_name,
    data=[search_embedding.tolist()],
    limit=3,
    output_fields=["monster_name", "location", "difficulty", "synonyms"]
)

print(f"\n搜索結(jié)果 '{search_query}':")
for hits in search_result:
    for hit in hits:
        print(f"  - {hit['entity']}")

# ——————————————
# 9. 條件查詢
# ——————————————
query_result = client.query(
    collection_name=collection_name,
    filter="difficulty == 'Low'",
    output_fields=["monster_name", "location", "difficulty", "synonyms"]
)

print(f"\n難度為 Low 的妖怪:")
for result in query_result:
    print(f"  - {result}")

運(yùn)行結(jié)果

加載 embedding 模型...
向量維度: 512

插入數(shù)據(jù): 100%|████████████| 2/2 [00:00<00:00, 10.5it/s]

加載 Collection 到內(nèi)存...
? Collection 已加載

搜索結(jié)果 '高難度妖怪':
  - {'monster_name': '虎先鋒', 'location': '竹林關(guān)隘', 'difficulty': 'High', 'synonyms': '猛虎妖, 虎妖'}

難度為 Low 的妖怪:
  - {'monster_name': '火猿', 'location': '火山洞窟', 'difficulty': 'Low', 'synonyms': '烈焰猿, 炎猿'}

學(xué)習(xí)路徑

  1. 簡易 RAG 學(xué)習(xí)
  2. LCEL 語法學(xué)習(xí)
  3. LangChain 讀取數(shù)據(jù)
    1. LangChain 讀取文本數(shù)據(jù)
    2. LangChain 讀取圖片數(shù)據(jù)
    3. LangChain 讀取 PDF 數(shù)據(jù)
    4. LangChain 讀取表格數(shù)據(jù)
  4. 文本切塊
  5. 向量嵌入與檢索
  6. 向量存儲(chǔ) ← 當(dāng)前
  7. 檢索前處理
  8. 索引優(yōu)化
  9. 檢索后處理
  10. 響應(yīng)生成
  11. 系統(tǒng)評(píng)估

項(xiàng)目地址

本文所有代碼示例都在 GitHub 開源:

https://github.com/zonezoen/refine-rag

歡迎 Star 和 Fork,一起學(xué)習(xí) RAG 技術(shù)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容