使用 Redis 作為向量數據庫

一、什么是向量數據庫?

  • 向量(Vector):在機器學習和 AI 中,向量是由一系列數字組成的序列,用于數值化地描述數據的特征或語義。文本、圖像、音頻等非結構化數據可以通過模型轉換成固定長度的向量。

  • 向量數據庫:專門存儲、索引和檢索向量的數據庫系統。可以基于向量之間的距離度量(如余弦相似度、歐氏距離等)進行高效的近鄰搜索(Nearest Neighbor Search),從而實現“語義搜索”或“相似度搜索”。

  • 與傳統搜索的區別

    • 傳統搜索依賴于關鍵詞精確匹配,無法識別同義詞、上下文或語義抽象。
    • 向量搜索通過將數據空間映射到高維向量空間,使語義相近的內容在向量空間中距離更近,從而返回更符合用戶意圖的結果。

二、準備工作

本文示例使用 Python 客戶端庫 RedisVL,以及常見的 Python 生態組件:

# 建議在虛擬環境中安裝
pip install redis pandas sentence-transformers tabulate redisvl

說明

  • redis:官方 Python 客戶端。
  • pandas:用于結果展示。
  • sentence-transformers:生成文本向量。
  • tabulate:渲染 Markdown 表格。
  • redisvl:Redis 向量搜索專用擴展(可選,本文使用原生 redis.commands.search API)。

三、連接 Redis

如果你使用本地 Redis:

import redisclient = redis.Redis(host="localhost", port=6379, decode_responses=True)

如果使用 Redis Cloud,則將 hostportpassword 替換為云端實例參數:

client = redis.Redis(host="redis-16379.c283.us-east-1-4.ec2.cloud.redislabs.com",port=16379,password="your_password_here",decode_responses=True,
)

四、準備示例數據集

本文使用開源的 bikes 數據集,每條記錄包含如下字段:

{"model": "Jigger","brand": "Velorim","price": 270,"type": "Kids bikes","specs": {"material": "aluminium","weight": "10"},"description": "Small and powerful, the Jigger is the best ride for the smallest of tikes! ..."
}

1. 拉取數據

import requestsURL = ("https://raw.githubusercontent.com/""bsbodden/redis_vss_getting_started""/main/data/bikes.json")
response = requests.get(URL, timeout=10)
bikes = response.json()

2. 存儲到 Redis(JSON 文檔)

pipeline = client.pipeline()
for i, bike in enumerate(bikes, start=1):key = f"bikes:{i:03}"pipeline.json().set(key, "$", bike)
pipeline.execute()

你可以這樣讀取某個字段:

client.json().get("bikes:010", "$.model")
# => ['Summit']

五、生成并存儲向量嵌入

1. 選擇文本嵌入模型

from sentence_transformers import SentenceTransformerembedder = SentenceTransformer('msmarco-distilbert-base-v4')

2. 批量獲取描述并生成向量

import numpy as np# 獲取所有 key
keys = sorted(client.keys("bikes:*"))# 批量讀取 description
descs = client.json().mget(keys, "$.description")
# 扁平化列表
descriptions = [item for sublist in descs for item in sublist]# 生成嵌入并轉換為 float32 列表
embeddings = embedder.encode(descriptions).astype(np.float32).tolist()
VECTOR_DIM = len(embeddings[0])  # 768

3. 插入向量字段

pipeline = client.pipeline()
for key, vec in zip(keys, embeddings):pipeline.json().set(key, "$.description_embeddings", vec)
pipeline.execute()

此時,每條記錄都多了一個 $.description_embeddings 數組字段。

六、創建檢索索引

為了同時支持基于字段和基于向量的搜索,需要創建一個 Redis Search 索引:

# 在 Redis CLI 環境中執行
FT.CREATE idx:bikes_vss ON JSONPREFIX 1 bikes:SCHEMA$.model                TEXT    WEIGHT 1.0 NOSTEM$.brand                TEXT    WEIGHT 1.0 NOSTEM$.price                NUMERIC$.type                 TAG     SEPARATOR ","$.description          TEXT    WEIGHT 1.0$.description_embeddings AS vector VECTOR FLAT \TYPE FLOAT32 DIM 768 DISTANCE_METRIC COSINE
  • FLAT:扁平索引;也可使用 HNSW(圖索引)以提高速度與擴展性。
  • TYPE FLOAT32:32 位浮點。
  • DIM 768:向量維度。
  • DISTANCE_METRIC COSINE:余弦相似度。

創建完成后,通過 FT.INFO idx:bikes_vss 可以查看索引狀態,確認文檔是否全部就緒。

七、執行向量搜索

1. 嵌入查詢文本

queries = ["Bike for small kids","Best Mountain bikes for kids","Cheap Mountain bike for kids",# ... 共 11 條
]
encoded_queries = embedder.encode(queries)

注意:必須使用與文檔相同的模型和參數,否則語義相似度會大打折扣。

2. 構造 KNN 查詢模板

from redis.commands.search.query import Queryknn_query = (Query("(*)=>[KNN 3 @vector $qvector AS score]").sort_by("score").return_fields("score", "id", "brand", "model", "description").dialect(2)
)
  • (*):不過濾,檢索全集。
  • KNN 3:返回最相近的 3 個向量。
  • @vector $qvector:向量字段名與占位符。
  • dialect(2):必要參數以支持向量查詢語法。

3. 執行查詢并展示

import pandas as pddef run_search(queries, encoded_qs):rows = []for q, vec in zip(queries, encoded_qs):docs = client.ft("idx:bikes_vss") \.search(knn_query, {"qvector": np.array(vec, dtype=np.float32).tobytes()}) \.docsfor doc in docs:rows.append({"query": q,"score": round(1 - float(doc.score), 2),"id":    doc.id,"brand": doc.brand,"model": doc.model,"desc":  doc.description[:100] + "..."})df = pd.DataFrame(rows)return df.sort_values(["query","score"], ascending=[True,False])table = run_search(queries, encoded_queries)
print(table.to_markdown(index=False))
queryscoreidbrandmodeldesc
Best Mountain bikes for kids0.54bikes:003NordChook air 5The Chook Air 5 gives kids aged six years and …

八、總結與后續

Redis 強大的模塊化生態(如 RedisJSON、RediSearch)讓其成為輕量級、易上手的向量數據庫方案。想深入了解更多:

  • 向量索引參數:扁平 VS HNSW、距離度量、并行構建等。
  • 多模態數據:結合 RedisAI,直接在 Redis 中進行模型推理。
  • 擴展語言客戶端:C#、JavaScript、Java、Go 等,滿足多種開發場景。

歡迎訪問 Redis University 和 Redis AI 資源庫 以獲得更多學習資料。

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

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

相關文章

變量的計算

不同類型變量之間的計算 數字型變量可以直接計算 在python中,數字型變量可以直接通過算術運算符計算bool型變量:True 對應數字1 ;False 對應數字0、 字符串變量 使用 拼接字符串 使用 * 拼接指定倍數的相同字符串 變量的輸入:&…

PostgreSQL學會如何建表

開始使用PostgreSQL之前, 上一節我們說了怎樣安裝它。 PostgreSQL可能已經安裝到你的電腦上了,安裝后postgre服務默認在電腦開機時運行啟動。 一.了解PostgreSQL的運行 PostgreSQL使用一種客戶端/服務器(C/S)模型。 和其他典型的客戶端/服務…

Linux驅動學習筆記(十)

熱插拔 1.熱插拔:就是帶電插拔,即允許用戶在不關閉系統,不切斷電源的情況下拆卸或安裝硬盤,板卡等設備。熱插拔是內核和用戶空間之間,通過調用用戶空間程序實現交互來實現的,當內核發生了某種熱拔插事件時…

大模型應用開發第五講:成熟度模型:從ChatGPT(L2)到未來自主Agent(L4)

大模型應用開發第五講:成熟度模型:從ChatGPT(L2)到未來自主Agent(L4) 資料取自《大模型應用開發:動手做AI Agent 》。 查看總目錄:學習大綱 關于DeepSeek本地部署指南可以看下我之…

Delphi 導入excel

Delphi導入Excel的常見方法可分為兩種主流方案:基于OLE自動化操作Excel原生接口和利用第三方組件庫。以下為具體實現流程及注意事項: ?一、OLE自動化方案(推薦基礎場景)? 該方法通過COM接口調用本地安裝的Excel程序&#xff0c…

Selenium的第四天打卡——Selenium瀏覽器應用(完整版)

Selenium瀏覽器應用 目錄 Selenium瀏覽器應用 一、瀏覽器操作示例代碼 1.設置瀏覽器縮放大小 2.瀏覽器前進和后退 3.瀏覽器刷新 二、WebDriver常見方法 三、鼠標事件示例 四、鍵盤事件示例 五、獲取斷言信息 六、窗口的切換 七、關鍵注意事項 一、瀏覽器操作示例代…

PMO價值重構:從項目管理“交付機器”到“戰略推手”

在數字化轉型浪潮中,項目管理辦公室(PMO)正經歷著前所未有的角色蛻變。傳統上,PMO往往被視為項目管理的“交付機器”,專注于項目的按時交付和資源分配。然而,隨著企業對戰略執行的重視,PMO正逐漸…

本地依賴庫的版本和庫依賴的版本不一致如何解決?

我用的 yarn v4 版本,所以以下教程命令都基于yarn 這里假設我報錯的庫名字叫 XXXXXXXX,依賴他的庫叫 AAAAAAAA 排查解決思路分析: 首先查看一下 XXXXXXXX 的依賴關系,執行 yarn why XXXXXXXX 首先我們要知道 yarn 自動做了庫…

SQLiteStudio - 免費開源、輕量高效,跨平臺的 SQLite 數據庫管理工具,代替 Navicat for SQLite

管理 SQLite 數據庫就用這款軟件,真的早該摒棄破解和盜版的 Navicat 了。 SQLiteStudio 是一款專注于管理 SQLite 數據庫 的桌面軟件,用于瀏覽和編輯 SQLite 數據庫文件。軟件的作者是來自波蘭的開發者 Pawe? Salawa,他是一位擁有 20 年 Ja…

DeepSeek R1-0528 新開源推理模型(免費且快速)

DeepSeek推出了新模型,但這不是R2! R1-0528是DeepSeek的最新模型,在發布僅數小時后就在開源社區獲得了巨大關注。 這個悄然發布的模型DeepSeek R1-0528,已經開始與OpenAI的o3一較高下。 讓我來詳細介紹這次更新的新內容。 DeepSeek R1-0528 發布 DeepSeek在這次發布中采…

Opera Neon發布該公司首款“AI代理”瀏覽器

Opera 的瀏覽器產品組合今日迎來了新成員。Opera Neon 是該公司首款“AI 代理”瀏覽器,旨在“重新思考瀏覽器在代理網絡中的角色”。開發人員聲稱,Neon 能夠理解用戶的意圖,并利用 AI 驅動的功能將其轉化為行動。 Opera Neon 由三個主要部分…

網絡安全之Web滲透加解密

項目基本使用 準備環境:node.js python chrome npm install chrome-remote-interface pip install playwright playwright install chromium pip install mitmproxy ............... 第一步啟動cdp.js。 第二步使用python .\cdp_load.py vue_demo,連…

【VSCode-Qt】Docker遠程連接的項目UI文件在 VSCode 上無法預覽

Docker遠程連接的UI文件在 VSCode 上無法預覽,通常是因為 VSCode 通過遠程開發擴展(Remote - SSH/Docker)連接到 Docker 容器時,某些圖形化功能未正確配置或支持。以下是可能原因和解決方案: 原因分析 X11 轉發未配置…

【HW系列】—web組件漏洞(Strtus2和Apache Log4j2)

本文僅用于技術研究,禁止用于非法用途。 文章目錄 Struts2Struts2 框架介紹Struts2 歷史漏洞匯總(表格)Struts2-045 漏洞詳解 Log4j2Log4j2 框架介紹Log4j2 漏洞原理1. JNDI 注入2. 利用過程 Log4j2 歷史漏洞JNDILDAP 反彈 Shell 流程 Strut…

《深度關系-從建立關系到彼此信任》

陳海賢老師推薦的書,花了幾個小時,感覺現在的人與人之間特別缺乏這種深度的關系,但是與一個人建立深度的關系并沒有那么簡單,反正至今為止,自己好像沒有與任何一個人建立了這種深度的關系,那種雙方高度同頻…

sass基礎語法

Sass(Syntactically Awesome Style Sheets)是一種 CSS 預處理器,提供了比原生 CSS 更強大、更靈活的語法功能。它有兩種語法格式: Sass(縮進語法,.sass 文件)SCSS(CSS-like 語法&am…

【JavaWeb】基本概念、web服務器、Tomcat、HTTP協議

目錄 1. 基本概念1.1 基本概念1.2 web應用程序1.3 靜態web1.4 動態web 2. web服務器3. tomcat詳解3.1 安裝3.2 啟動3.3 配置3.3.1 配置啟動的端口號3.3.2 配置主機的名稱3.3.3 其他常用配置項日志配置數據源配置安全配置 3.4 發布一個網站 4. Http協議4.1 什么是http4.2 http的…

AI in Game,大模型能力與實時音視頻技術融合,交出AI應用新答卷

隨著AI的技術進步和工具普及,尤其是在這兩年的躍進之后,AI在游戲行業內的應用已經逐步由理念設想推向落地實踐。從蔡浩宇披露的AI新游《Whispers From The Star》到GDC上各大廠家呈現的游戲AI新亮點,我們看到了更多AI與游戲的結合方式&#x…

Android Studio 2022.2.1.20 漢化教程

查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下載:https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable

常見的分詞算法

常見的分詞方法分類如下: 類型名稱說明優缺點1?? 基于空格/標點Word-level以空格或標點劃分,如 "Hello, world!" → ["Hello", ",", "world", "!"]?簡單,?無法處理新詞,詞…