如何在Redis向量数据库中存储加载自定义Embedding及设置TTL?
问题描述
用户已有LangChain结合Redis与OpenAI Embeddings的示例代码,但不清楚如何构建、使用自定义Embedding,实现从文本文件加载文本、生成Embedding并存入Redis后进行检索的流程。用户提供了一个OpenAI生成Embedding的自定义函数,同时希望了解Redis中Embedding的TTL设置方法。
解决方案
一、完整实现示例
1. 核心准备:自定义Embedding类
LangChain的Redis向量存储需要符合Embeddings接口的实例,因此需要将自定义的get_embedding函数封装成LangChain兼容的类:
from langchain.embeddings.base import Embeddings from openai import OpenAI client = OpenAI() class CustomOpenAIEmbeddings(Embeddings): def __init__(self, model="text-embedding-ada-002"): self.model = model def embed_documents(self, texts): # 批量处理文本生成Embedding texts = [text.replace("\n", " ") for text in texts] response = client.embeddings.create(input=texts, model=self.model) return [res.embedding for res in response.data] def embed_query(self, text): # 生成单个查询文本的Embedding text = text.replace("\n", " ") return client.embeddings.create(input=[text], model=self.model).data[0].embedding
2. 加载文本文件的函数
实现从文本文件读取内容,按行读取并为每行生成对应元数据:
def load_text_from_file(file_path): """从文本文件加载内容,每行作为一个独立文档""" with open(file_path, "r", encoding="utf-8") as f: texts = [line.strip() for line in f if line.strip()] # 为每个文档生成元数据(包含来源文件和行号) metadatas = [{"source": file_path, "line_number": i+1} for i in range(len(texts))] return texts, metadatas
3. 存入Redis并执行检索
整合上述功能,完成从加载文本到检索的全流程:
from langchain.vectorstores.redis import Redis # 初始化自定义Embedding embeddings = CustomOpenAIEmbeddings(model="text-embedding-ada-002") # 加载目标文本文件内容 texts, metadatas = load_text_from_file("your_text_file.txt") # 将文本、Embedding存入Redis rds = Redis.from_texts( texts=texts, embedding=embeddings, metadatas=metadatas, redis_url="redis://localhost:6379", index_name="custom_documents" ) # 执行相似性检索 query = "你要查询的关键词或句子" results = rds.similarity_search(query) # 输出检索结果 for idx, result in enumerate(results): print(f"结果 {idx+1}:") print(f"内容: {result.page_content}") print(f"元数据: {result.metadata}\n")
二、Redis中Embedding的TTL设置方法
Redis作为向量存储时,可通过两种方式设置Embedding的过期时间(TTL):
1. 创建索引时指定TTL(推荐)
在调用Redis.from_texts或Redis.from_documents时,通过RedisVectorStoreConfig自定义索引结构,添加expire字段:
from langchain.vectorstores.redis import Redis, RedisVectorStoreConfig # 配置索引,设置TTL为86400秒(1天) config = RedisVectorStoreConfig( index_name="custom_documents", redis_url="redis://localhost:6379", # 自定义Schema,添加expire字段 schema={ "tag": ["source"], "text": ["page_content"], "numeric": ["line_number"], "vector": { "name": "embedding", "algorithm": "FLAT", "distance_metric": "COSINE", "dimensions": 1536 # text-embedding-ada-002的维度是1536 }, "expire": 86400 # TTL时间,单位:秒 } ) # 使用配置创建向量存储 rds = Redis.from_texts( texts=texts, embedding=embeddings, metadatas=metadatas, config=config )
2. 手动为已存储的Embedding设置TTL
如果索引已创建,可直接通过Redis客户端为指定键设置过期时间:
# 获取Redis客户端实例 redis_client = rds.client # 遍历所有目标文档键,设置TTL为86400秒(1天) for key in redis_client.keys("custom_documents:*"): redis_client.expire(key, 86400)
注意:设置TTL后,Redis会自动删除过期的Embedding文档,无需手动清理。
内容的提问来源于stack exchange,提问作者John Glabb
相关产品推荐
相关产品推荐

