You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:25:13