RedisVL 入門構建高效的 AI 向量搜索應用

一、前置條件

在開始之前,請確保:

  • 已在 Python 環境中安裝 redisvl
  • 運行 Redis Stack 或 Redis Cloud 實例。

二、定義索引架構(IndexSchema)

索引架構(IndexSchema)用于定義 Redis 的索引配置和字段信息,支持通過 Python 字典或 YAML 文件創建。以下以用戶數據集為例,包含 userjobagecredit_score 和三維的 user_embedding 向量。

2.1.示例架構

假設我們需要為數據集定義一個索引,索引名稱為 user_simple,鍵前綴為 user_simple_docs

2.3.YAML 格式
version: '0.1.0'index:name: user_simpleprefix: user_simple_docsfields:- name: usertype: tag- name: credit_scoretype: tag- name: jobtype: text- name: agetype: numeric- name: user_embeddingtype: vectorattrs:algorithm: flatdims: 3distance_metric: cosinedatatype: float32

將上述內容保存為 schema.yaml 文件。

3.3.Python 字典格式
schema = {"index": {"name": "user_simple","prefix": "user_simple_docs",},"fields": [{"name": "user", "type": "tag"},{"name": "credit_score", "type": "tag"},{"name": "job", "type": "text"},{"name": "age", "type": "numeric"},{"name": "user_embedding","type": "vector","attrs": {"dims": 3,"distance_metric": "cosine","algorithm": "flat","datatype": "float32"}}]
}

三、準備樣本數據集

我們創建一個包含 userjobagecredit_scoreuser_embedding 字段的樣本數據集。user_embedding 為三維向量,僅用于演示。

import numpy as npdata = [{'user': 'john','age': 1,'job': 'engineer','credit_score': 'high','user_embedding': np.array([0.1, 0.1, 0.5], dtype=np.float32).tobytes()},{'user': 'mary','age': 2,'job': 'doctor','credit_score': 'low','user_embedding': np.array([0.1, 0.1, 0.5], dtype=np.float32).tobytes()},{'user': 'joe','age': 3,'job': 'dentist','credit_score': 'medium','user_embedding': np.array([0.9, 0.9, 0.1], dtype=np.float32).tobytes()}
]

注意,user_embedding 向量通過 NumPy 轉換為字節格式,以符合 Redis 的存儲要求。

四、創建搜索索引(SearchIndex)

準備好架構和數據集后,我們可以創建 SearchIndex 對象。

4.1.使用自定義 Redis 連接

如果需要自定義 Redis 連接設置或共享連接池:

from redisvl.index import SearchIndex
from redis import Redisclient = Redis.from_url("redis://localhost:6379")
index = SearchIndex.from_dict(schema, redis_client=client, validate_on_load=True)

4.2.讓索引管理連接

對于簡單場景,可以讓索引自動管理 Redis 連接:

index = SearchIndex.from_dict(schema, redis_url="redis://localhost:6379", validate_on_load=True)

4.3.創建索引

執行以下命令創建索引:

index.create(overwrite=True)

此時,索引已創建但尚無數據。

五、使用 rvl CLI 檢查索引

通過 rvl 命令行工具檢查索引信息:

rvl index listall

輸出:

19:17:09 [RedisVL] INFO   Indices:
19:17:09 [RedisVL] INFO   1. user_simple

查看具體索引詳情:

rvl index info -i user_simple

輸出:

Index Information:
╭──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────╮
│ Index Name           │ Storage Type         │ Prefixes             │ Index Options        │ Indexing             │
├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
| user_simple          | HASH                 | ['user_simple_docs'] | []                   | 0                    |
╰──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────╯
Index Fields:
╭─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────╮
│ Name            │ Attribute       │ Type            │ Field Option    │ Option Value    │ Field Option    │ Option Value    │ Field Option    │ Option Value    │ Field Option    │ Option Value    │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ user            │ user            │ TAG             │ SEPARATOR       │ ,               │                 │                 │                 │                 │                 │                 │
│ credit_score    │ credit_score    │ TAG             │ SEPARATOR       │ ,               │                 │                 │                 │                 │                 │                 │
│ job             │ job             │ TEXT            │ WEIGHT          │ 1               │                 │                 │                 │                 │                 │                 │
│ age             │ age             │ NUMERIC         │                 │                 │                 │                 │                 │                 │                 │                 │
│ user_embedding  │ user_embedding  │ VECTOR          │ algorithm       │ FLAT            │ data_type       │ FLOAT32         │ dim             │ 3               │ distance_metric │ COSINE          │
╰─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────╯

六、加載數據到索引

使用 load 方法將樣本數據加載到 Redis 中:

keys = index.load(data)
print(keys)

輸出:

['user_simple_docs:01JT4PPPNJZMSK2395RKD208T9', 'user_simple_docs:01JT4PPPNM63J55ZESZ4TV1VR8', 'user_simple_docs:01JT4PPPNM59RCKS2YQ58B1HQW']

RedisVL 使用 Pydantic 進行數據驗證,確保加載的數據符合架構要求。如果數據無效(例如 user_embedding 不是字節類型),會拋出 SchemaValidationError

七、更新索引數據

通過再次調用 load 方法可以插入或更新(upsert)數據:

new_data = [{'user': 'tyler','age': 9,'job': 'engineer','credit_score': 'high','user_embedding': np.array([0.1, 0.3, 0.5], dtype=np.float32).tobytes()
}]
keys = index.load(new_data)
print(keys)

輸出:

['user_simple_docs:01JT4PPX63CH5YRN2BGEYB5TS2']

八、創建并執行向量查詢

使用 VectorQuery 創建向量查詢對象:

from redisvl.query import VectorQueryquery = VectorQuery(vector=[0.1, 0.1, 0.5],vector_field_name="user_embedding",return_fields=["user", "age", "job", "credit_score", "vector_distance"],num_results=3
)

執行查詢:

results = index.query(query)

輸出:

vector_distance  user  age  job       credit_score
0               john  1    engineer  high
0               mary  2    doctor    low
0.0566299557686 tyler 9    engineer  high

九、使用異步 Redis 客戶端

在生產環境中,推薦使用異步客戶端 AsyncSearchIndex

from redisvl.index import AsyncSearchIndex
from redis.asyncio import Redisclient = Redis.from_url("redis://localhost:6379")
index = AsyncSearchIndex.from_dict(schema, redis_client=client)
results = await index.query(query)

輸出與同步查詢一致。

十、更新索引架構

如果需要更新索引架構(例如將 job 字段從 text 改為 tag,或將 user_embeddingflat 向量索引改為 hnsw),可以直接修改并重新創建索引:

index.schema.remove_field("job")
index.schema.remove_field("user_embedding")
index.schema.add_fields([{"name": "job", "type": "tag"},{"name": "user_embedding","type": "vector","attrs": {"dims": 3,"distance_metric": "cosine","algorithm": "hnsw","datatype": "float32"}}
])await index.create(overwrite=True, drop=False)

這將保留現有數據,僅更新索引配置。

十一、檢查索引統計信息

使用 rvl CLI 查看索引統計:

rvl stats -i user_simple

輸出:

Statistics:
╭─────────────────────────────┬────────────╮
│ Stat Key                    │ Value      │
├─────────────────────────────┼────────────┤
│ num_docs                    │ 4          │
│ num_terms                   │ 0          │
│ max_doc_id                  │ 4          │
│ num_records                 │ 20         │
│ percent_indexed             │ 1          │
│ hash_indexing_failures      │ 0          │
│ number_of_uses              │ 2          │
│ bytes_per_record_avg        │ 48.2000007 │
│ doc_table_size_mb           │ 4.23431396 │
│ inverted_sz_mb              │ 9.19342041 │
│ key_table_size_mb           │ 1.93595886 │
│ offset_bits_per_record_avg  │ nan        │
│ offset_vectors_sz_mb        │ 0          │
│ offsets_per_term_avg        │ 0          │
│ records_per_doc_avg         │ 5          │
│ sortable_values_size_mb     │ 0          │
│ total_indexing_time         │ 0.74400001 │
│ total_inverted_index_blocks │ 11         │
│ vector_index_sz_mb          │ 0.23560333 │
╰─────────────────────────────┴────────────╯

十二、清理

清理數據或索引:

# 清除索引中的所有數據,但保留索引結構
await index.clear()# 完全刪除索引及其數據
await index.delete()

十三、總結

RedisVL 提供了一個簡單而強大的接口,用于在 Redis 中進行向量搜索。通過定義索引架構、加載數據、執行向量查詢以及更新索引,你可以快速構建高效的 AI 應用。結合異步客戶端和 CLI 工具,RedisVL 適用于從開發到生產環境的多種場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88234.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ssm移動學習平臺微信小程序源碼數據庫文檔

摘 要 由于APP軟件在開發以及運營上面所需成本較高,而用戶手機需要安裝各種APP軟件,因此占用用戶過多的手機存儲空間,導致用戶手機運行緩慢,體驗度比較差,進而導致用戶會卸載非必要的APP,倒逼管理者必須改…

【Python】Tkinter模塊(巨詳細)

專欄文章索引:Python 有問題可私聊:QQ:3375119339 本文內容系本人根據閱讀的《Python GUI設計tkinter從入門到實踐》所得,以自己的方式進行總結和表達。未經授權,禁止在任何平臺上以任何形式復制或發布原始書籍的內容。如有侵權,請聯系我刪除。 目錄 一、Tkinter與GUI …

【C++特殊工具與技術】局部類

在 C 的類體系中,除了全局類、嵌套類(在類內部定義的類),還有一種特殊的存在 ——局部類(Local Class)。它像函數內部的 “封閉王國”,作用域嚴格限制在所屬函數內,既擁有類的封裝特…

《C#圖解教程 第5版》深度推薦

《C#圖解教程 第5版》深度推薦 在 C# 編程語言的浩瀚學習資源中,《C#圖解教程 第5版》宛如一座燈塔,為開發者照亮前行之路。通過其詳實的目錄,我們能清晰窺見這本書在知識架構、學習引導上的匠心獨運,無論是編程新手還是進階開發者…

【Kubernetes】配置自定義的 kube-scheduler 調度規則

在最近一次 K8s 環境的維護中,發現多個 Pod 使用相同鏡像時,調度到固定節點的問題導致集群節點資源分配不均的情況。 啟用調度器的打分日志后發現這一現象是由 ImageLocality 打分策略所引起的(所有的節點中,只有一個節點有運行該…

跟著AI學習C# Day21

📅 Day 21:動態類型與動態語言運行時(Dynamic Types & DLR) ? 學習目標: 理解什么是 dynamic 類型;掌握 dynamic 與 object 的區別;理解 DLR(Dynamic Language Runtime&#…

leetcode-3085.成為K字符串需要刪除的最小字符串數

題目描述 解題思路 這題不難想到需要統計每個字母的出現頻率,一共有26個字母,故cnt數組有26維。我們可以枚舉其中一種作為「刪除操作結束后出現頻率最低的字符」,將其設置為 c,那么所有頻率小于 c 的字符都會被刪除,所…

Android 中 解析 XML 文件的幾種方式

在 Android 開發中,解析 XML 文件有多種方式,每種方式都有其特點和適用場景。常見的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 一、xml 文件及數據類 1、xml 文件 將測試用 book.xml 文件放在項目的 app/src/main/assets 目錄下,文件內容如下:<lib…

python里的abc庫是什么東西

Python 中的 ABC&#xff1a;為什么你需要抽象基類&#xff1f;告別“假鴨子”&#xff0c;擁抱真抽象&#xff01; 你是不是經常在 Python 項目中感到困惑&#xff1a;我定義了一個類&#xff0c;希望它能被其他類繼承并實現某些特定功能&#xff0c;但又不想它被直接實例化&…

設計模式精講 Day 9:裝飾器模式(Decorator Pattern)

【設計模式精講 Day 9】裝飾器模式&#xff08;Decorator Pattern&#xff09; 文章內容 在軟件開發中&#xff0c;靈活擴展功能是提升系統可維護性和可復用性的關鍵。裝飾器模式作為一種結構型設計模式&#xff0c;為對象動態地添加職責&#xff0c;而無需通過繼承來實現。它…

瀏覽器無法訪問:Nginx下的基于域名的虛擬主機

檢查步驟如下&#xff1a; 1、nginx -t &#xff0c;檢查配置文件是否有語法錯誤 [root89 ~]# nginx -t nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx/conf/nginx.conf test is successful # 可以看到 配置…

【appium】6.appium遇到的問題

1.appium-python-client 修改版本1.5 為5.1.1,后執行python程序時&#xff0c;提示&#xff1a; raise TypeError( TypeError: missing 1 required keyword-only argument: options (instance of driver options.Options class) 你遇到的錯誤&#xff1a; TypeError: missing…

C++法則3:使用拷貝和交換的賦值運算符自動就是異常安全的,且能正確處理自賦值。

C法則3&#xff1a;使用拷貝和交換的賦值運算符自動就是異常安全的&#xff0c;且能正確處理自賦值。 這條法則強調了使用"拷貝和交換"(Copy-and-Swap)慣用法來實現賦值運算符()的優點&#xff1a; 關鍵點 異常安全&#xff1a;拷貝和交換方法天然提供了強異常安全…

純血HarmonyOS5 打造小游戲實踐:掃雷(附源文件)

鴻蒙掃雷游戲的核心架構設計 鴻蒙OS掃雷游戲采用了MVC&#xff08;模型-視圖-控制器&#xff09;的架構思想&#xff0c;將游戲邏輯與UI展示分離&#xff0c;使得代碼結構清晰且易于維護。整個游戲由以下幾個核心部分構成&#xff1a; 數據模型設計 游戲的基礎數據模型是Cel…

Linux C語言的opendir如何獲取目錄下的隱藏文件

在 Linux 文件系統中&#xff0c;所謂隱藏文件是文件名以 . 開頭的文件&#xff08;例如 .bashrc、.git、.config 等&#xff09;。 在編程層面&#xff0c;opendir readdir 并不會自動排除隱藏文件。 只要你不在代碼中手動過濾&#xff0c;readdir 會把目錄下所有文件&#…

母線槽接頭過熱隱患難防?在線測溫方案實時守護電力安全

近年來&#xff0c;由于各種設備對電力的大力需求&#xff0c;并有逐年增加的趨勢&#xff0c;傳統電路接線方式在施工時越來越力不從心。系統一旦定型&#xff0c;后續想要簡化變更更是難上加難。母線槽方案因此興起&#xff0c;憑借多點連接&#xff08;接頭、插接頭、插接箱…

Windows本地部署wordpress

一、下載wordpress 地址&#xff1a;Download – WordPress.org 下載后解壓出來 二、下載小皮面板 地址&#xff1a;Windows版phpstudy下載 - 小皮面板(phpstudy) 下載后安裝 三、打開小皮面板&#xff0c;安裝對應內置應用 1、MySQL8&#xff08;注意要是8版本,卸載其他版本…

Android 性能優化

一、Android中檢測性能工具 Profiler —— 使用Profiler的CPU分析功能。 Method Tracing ———— 通過該方法,我們可以記錄應用運行過程中的方法調用情況,包括每個方法的執行時間、調用次數等。 Systrace 是Android平臺提供的一款工具,用于記錄短期內的設備活動。 Systra…

圖片壓縮工具 | Electron應用配合 commander 提供命令行調用功能

OPEN-IMAGE-TINY&#xff0c;一個基于 Electron VUE3 的圖片壓縮工具&#xff0c;項目開源地址&#xff1a;https://github.com/0604hx/open-image-tiny 功能描述 應用程序的命令行調用功能允許用戶通過終端&#xff08;如Windows的CMD/PowerShell或Linux/macOS的Terminal&am…

Linux》》Shell腳本 基本語法

執行腳本的三種方式 查找變量的過程 變量引用的順序》》先從當前進程查詢變量&#xff0c;如果當前進程沒有此變量&#xff0c;默認去父進程查找這個變量。如果查找到則返回&#xff0c;否則一直查找到 祖宗&#xff08;PID為1&#xff09;&#xff0c;還沒有&#xff0c;則就…