本文是 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ì)面臨:
-
檢索效率塌方(計(jì)算量過大):
傳統(tǒng)數(shù)據(jù)庫查找數(shù)據(jù)是“相等判斷”,而向量搜索需要計(jì)算空間距離。如果你有 100 萬條數(shù)據(jù),每搜一次都要全表掃一遍并計(jì)算相似度O(n) 復(fù)雜,查詢一次可能要幾秒甚至幾分鐘。向量數(shù)據(jù)庫通過 ANN(近似最近鄰)算法(如 HNSW),將搜索效率提升到了毫秒級(jí)O(log n) 復(fù)雜度。 -
維度災(zāi)難(內(nèi)存壓力):
一個(gè) 1536 維的向量(OpenAI 標(biāo)準(zhǔn))看起來不大,但幾百萬條疊在一起,會(huì)瞬間撐爆普通的服務(wù)器內(nèi)存。向量數(shù)據(jù)庫專門優(yōu)化了數(shù)據(jù)的壓縮與加載策略。 -
工程化缺失:
向量數(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ī)?”他直接罷工”。
- 你問:“有沒有編號(hào)為
-
向量數(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í)路徑
- 簡易 RAG 學(xué)習(xí)
- LCEL 語法學(xué)習(xí)
- LangChain 讀取數(shù)據(jù)
- LangChain 讀取文本數(shù)據(jù)
- LangChain 讀取圖片數(shù)據(jù)
- LangChain 讀取 PDF 數(shù)據(jù)
- LangChain 讀取表格數(shù)據(jù)
- 文本切塊
- 向量嵌入與檢索
- 向量存儲(chǔ) ← 當(dāng)前
- 檢索前處理
- 索引優(yōu)化
- 檢索后處理
- 響應(yīng)生成
- 系統(tǒng)評(píng)估
項(xiàng)目地址
本文所有代碼示例都在 GitHub 開源:
https://github.com/zonezoen/refine-rag
歡迎 Star 和 Fork,一起學(xué)習(xí) RAG 技術(shù)!