Redis 與 AI:從緩存到智能搜索的融合之路
在當今數字化時代,Redis 不僅是一個高性能的緩存系統,更是一個強大的 AI 支持平臺。Redis 通過其向量數據庫功能和 AI 工具,為現代應用提供了獨特的技術優勢。
一、Redis 的 AI 能力
(一)向量數據庫功能
Redis 的向量數據庫功能是其 AI 能力的核心。它支持以下功能:
- 存儲高維向量數據:Redis 可以存儲向量及其相關的元數據,這些數據可以存儲在哈希或 JSON 文檔中。
- 執行相似性搜索:通過向量搜索(KNN 查詢),Redis 可以快速找到與目標向量最相似的向量。
- 支持向量范圍查詢:允許用戶基于向量距離進行范圍查詢。
- 元數據過濾功能:在執行向量搜索時,可以結合其他條件進行篩選,例如根據用戶 ID 或類別過濾結果。
(二)RedisAI 模塊
RedisAI 是 Redis 的一個模塊,旨在將機器學習和深度學習帶入 Redis 生態系統。它的主要特性包括:
- 張量存儲:支持存儲多維數組(張量),這些張量可以直接用作模型的輸入或輸出。
- 模型服務:支持加載和執行來自 TensorFlow、PyTorch 和 ONNX 的預訓練模型。
- 腳本執行:通過 TorchScript 提供在 CPU 或 GPU 上執行預處理和后處理操作的能力。
- DAG 執行:允許定義和執行包含多個操作的有向無環圖(DAG),實現復雜的推理管道。
- GPU 加速:支持 GPU 執行,充分利用硬件加速能力。
(三)Redis for AI
Redis for AI 是 Redis 提供的一套工具,旨在幫助開發者更高效地構建和部署 AI 應用。它包括:
- 向量數據庫:提供世界上最快的向量數據庫,支持高效的相似性搜索。
- 緩存解決方案:提供先進的緩存功能,減少對大型語言模型的依賴,降低成本并提升性能。
- 實時架構(RAG):支持基于檢索增強生成(Retrieval Augmented Generation)的應用,提升智能體的推理能力和響應速度。
二、Redis 作為向量數據庫的運行測試代碼
(一)環境準備
-
安裝 Redis Stack
使用 Docker 安裝 Redis Stack:docker run -d --name redis-stack -p 6379:6379 redis/redis-stack:latest
-
準備數據
下面的代碼展示了如何將數據存儲到 Redis 中,并創建向量字段:import redis import numpy as np from redis.commands.search.field import TextField, VectorField from redis.commands.search.indexDefinition import IndexDefinition, IndexType from redis.commands.search.query import Query from sentence_transformers import SentenceTransformer# 連接 Redis client = redis.Redis(host="localhost", port=6379, decode_responses=True)# 存儲向量數據 keys = ["doc:1", "doc:2"] embeddings = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], dtype=np.float32) for key, embedding in zip(keys, embeddings):client.hset(key, mapping={"embedding": embedding.tobytes()})# 創建索引 schema = (TextField("id", no_stem=True, as_name="id"),VectorField("embedding","FLAT",{"TYPE": "FLOAT32", "DIM": 3, "DISTANCE_METRIC": "L2"},as_name="embedding",), ) definition = IndexDefinition(prefix=["doc:"], index_type=IndexType.HASH) client.ft("idx:docs").create_index(fields=schema, definition=definition)
(二)向量搜索測試
以下代碼展示了如何執行向量搜索:
# 查詢向量
query_embedding = np.array([0.1, 0.2, 0.3], dtype=np.float32)
query = (Query("(*)=>[KNN 2 @embedding $query_embedding AS score]").sort_by("score").return_fields("id", "score").dialect(2)
)
results = client.ft("idx:docs").search(query, query_params={"query_embedding": query_embedding.tobytes()})
for doc in results.docs:print(doc)
三、Spring Boot 集成 Redis 向量數據庫的代碼案例
(一)環境準備
-
添加依賴
在pom.xml
文件中添加以下依賴:<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-redis-store-spring-boot-starter</artifactId> </dependency>
-
配置 Redis
在application.properties
文件中配置 Redis:spring.ai.vectorstore.redis.uri=redis://localhost:6379 spring.ai.vectorstore.redis.index=default-index spring.ai.vectorstore.redis.prefix=default:
(二)使用 Redis 向量數據庫
以下代碼展示了如何在 Spring Boot 應用程序中使用 Redis 向量數據庫:
@Autowired
private VectorStore vectorStore;@PostMapping("/embedding")
public ResultEntity<Boolean> embedding(@RequestParam MultipartFile file) throws Exception {TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));List<Document> splitDocuments = new TokenTextSplitter().apply(tikaDocumentReader.read());vectorStore.add(splitDocuments);return ResultUtils.success(true);
}@GetMapping("/query")
public List<Document> query(@RequestParam String query) {return vectorStore.similaritySearch(query);
}
四、Redis 的 AI 應用場景
(一)實時數據緩存
Redis 的內存存儲特性使其能夠快速緩存 API 返回值,提高響應速度。例如,使用 LangChain 的 RedisCache
實現 LLM(大語言模型)的緩存功能:
set_llm_cache(RedisCache(redis_client));
(二)語義搜索與檢索
Redis 的向量數據庫功能可以用于語義搜索。例如,結合 LangChain 的 RedisVectorStore
,可以實現智能搜索功能:
vector_store = RedisVectorStore(redis_client);
(三)會話持久化
Redis 可以記錄和檢索會話歷史,增強對話系統的持續性。例如,使用 LangGraph 的 langgraph-checkpoint-redis
,可以實現跨會話的持久化記憶。
五、總結
Redis 的 AI 能力和緩存功能的結合,為現代應用架構提供了強大的支持。通過合理配置和使用,可以在單一實例中同時滿足緩存和向量搜索的需求,既節省了資源,又簡化了系統架構。