0

0

Redis向量数据库中高效存储与检索自定义文本嵌入教程

碧海醫心

碧海醫心

发布时间:2025-07-11 22:32:26

|

319人浏览过

|

来源于php中文网

原创

Redis向量数据库中高效存储与检索自定义文本嵌入教程

本教程详细指导如何利用LangChain框架,将本地文本文件内容加载、切分,并生成高质量的文本嵌入(Embeddings),随后将其高效存储至Redis向量数据库。文章涵盖了从数据加载、文本切分、嵌入生成到向量存储和相似性搜索的全流程,旨在帮助开发者构建基于自定义数据的智能检索系统,实现文本内容的智能化管理与快速检索。

1. 引言

在构建智能问答、语义搜索或推荐系统时,将非结构化文本数据转化为可计算的向量表示(即嵌入)并高效存储是核心步骤。redis作为一款高性能的内存数据库,结合其向量搜索能力,成为了存储和检索文本嵌入的理想选择。本教程将深入探讨如何利用langchain库,从本地文本文件加载数据,进行预处理,生成嵌入,并最终将其存储到redis向量数据库中,以便后续进行高效的相似性搜索。

2. 核心概念解析

在开始实践之前,理解几个关键概念至关重要:

  • 文本加载(Text Loading):指从文件、网页或其他数据源读取原始文本内容的过程。对于本地文件,LangChain提供了TextLoader等工具
  • 文本切分(Text Splitting):由于大型文档通常不适合直接嵌入或作为单个搜索单元,需要将其切分成更小、更具语义连贯性的块(chunks)。CharacterTextSplitter是常用的切分器之一。
  • 文本嵌入(Text Embeddings):将文本转化为高维浮点数向量的过程。这些向量能够捕捉文本的语义信息,使得语义相似的文本在向量空间中距离更近。OpenAI Embeddings是常用的嵌入模型之一。
  • Redis向量数据库(Redis Vector Database):Redis不仅是一个键值存储,通过Redis Stack中的RediSearch模块,它还能支持向量索引和相似性搜索,使其成为一个功能强大的向量数据库。LangChain提供了与Redis的集成,简化了操作。

3. 实践指南:构建自定义文本嵌入检索系统

本节将通过一个具体的示例,展示如何将本地union.txt文件中的内容加载、处理并存储到Redis中,并执行相似性搜索。

3.1 环境准备

在开始之前,请确保您已安装必要的Python库和Redis服务:

pip install langchain openai redis

确保您的本地或远程Redis服务正在运行,默认端口为6379。

3.2 加载与预处理文本数据

首先,我们需要从本地文件加载文本。假设您有一个名为union.txt的文本文件,其中包含您希望进行嵌入和搜索的内容。

union.txt 示例内容:

你好星识
你好星识

你的全能AI工作空间

下载
This is a comprehensive document about the history of the European Union.
It covers its formation, key milestones, and challenges faced over the decades.
The EU aims to promote peace, values, and the well-being of its peoples.
It has developed an internal single market through a standardised system of laws.
The European Union has faced various challenges, including economic crises and Brexit.
Despite these, it continues to play a significant role in global politics and trade.

接下来,使用TextLoader加载文件,并使用CharacterTextSplitter将文档切分成小块。切分是提高检索准确性和效率的关键步骤。

from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Redis
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
import os

# 配置OpenAI API Key
# 请确保您的环境变量中已设置 OPENAI_API_KEY 或在此处直接赋值
# os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" 

# 1. 初始化嵌入模型
# 使用OpenAIEmbeddings,需要配置OpenAI API Key
embeddings = OpenAIEmbeddings()

# 2. 加载文本文件
# 假设您的文本文件名为 union.txt 且与脚本在同一目录下
loader = TextLoader("union.txt", encoding="utf-8")
documents = loader.load()

# 3. 切分文档
# chunk_size 定义每个文本块的最大字符数
# chunk_overlap 定义相邻文本块之间的重叠字符数,有助于保持上下文连贯性
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

print(f"原始文档切分成了 {len(docs)} 个文本块。")
# 打印第一个文本块的内容
if docs:
    print(f"第一个文本块内容示例:\n{docs[0].page_content[:200]}...")

3.3 存储嵌入至Redis

切分后的文档列表docs现在可以与嵌入模型一起,通过Redis.from_documents方法存储到Redis向量数据库中。这个方法会自动为每个文档生成嵌入,并将文档内容、元数据和嵌入向量一同存储。

# 4. 存储文档和嵌入到Redis
# redis_url 指定Redis服务的地址
# index_name 是在Redis中创建的索引名称,用于组织和检索向量数据
vectorstore = Redis.from_documents(
    docs,
    embeddings,
    redis_url="redis://localhost:6379",
    index_name="users", # 建议使用更具描述性的索引名,例如 "eu_documents"
)

print(f"成功将 {len(docs)} 个文本块及其嵌入存储到Redis索引 '{vectorstore.index_name}' 中。")

3.4 执行相似性搜索

一旦数据存储在Redis中,您就可以执行相似性搜索,根据查询文本的语义相似性来检索相关的文档块。

# 5. 执行相似性搜索
# similarity_search_with_score 返回匹配的文档以及它们的相似度分数
# 分数越低表示相似度越高(通常是余弦距离或L2距离,取决于Redis索引配置)
query = "What are the main goals of the European Union?" # 更相关的查询
# query = "He met the Ukrainian people." # 使用原问题中的查询,如果文档内容不相关,结果可能不理想

print(f"\n执行查询: '{query}'")
results_with_score = vectorstore.similarity_search_with_score(query)

# 打印搜索结果
if results_with_score:
    print("搜索结果 (文档内容和相似度分数):")
    for doc, score in results_with_score:
        print(f"  文档内容: {doc.page_content[:150]}...")
        print(f"  相似度分数: {score}")
        print("-" * 20)
else:
    print("未找到相关结果。")

完整示例代码:

from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Redis
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
import os

# --- 配置部分 ---
# 请确保您的环境变量中已设置 OPENAI_API_KEY
# 或者在此处直接赋值,但不推荐在生产环境直接硬编码
# os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" 

REDIS_URL = "redis://localhost:6379"
INDEX_NAME = "eu_documents_index" # 建议使用更具描述性的索引名
TEXT_FILE_PATH = "union.txt"

# --- 1. 初始化嵌入模型 ---
embeddings = OpenAIEmbeddings()

# --- 2. 加载文本文件 ---
try:
    loader = TextLoader(TEXT_FILE_PATH, encoding="utf-8")
    documents = loader.load()
    print(f"成功加载文件: {TEXT_FILE_PATH}")
except FileNotFoundError:
    print(f"错误: 文件 '{TEXT_FILE_PATH}' 未找到。请确保文件存在。")
    exit()
except Exception as e:
    print(f"加载文件时发生错误: {e}")
    exit()

# --- 3. 切分文档 ---
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) # 调整块大小和重叠
docs = text_splitter.split_documents(documents)
print(f"原始文档切分成了 {len(docs)} 个文本块。")

# --- 4. 存储文档和嵌入到Redis ---
try:
    vectorstore = Redis.from_documents(
        docs,
        embeddings,
        redis_url=REDIS_URL,
        index_name=INDEX_NAME,
    )
    print(f"成功将 {len(docs)} 个文本块及其嵌入存储到Redis索引 '{INDEX_NAME}' 中。")
except Exception as e:
    print(f"存储到Redis时发生错误: {e}")
    print("请检查Redis服务是否运行,以及redis-py和RedisStack是否正确安装。")
    exit()

# --- 5. 执行相似性搜索 ---
query = "What are the main objectives of the European Union?" 
print(f"\n执行查询: '{query}'")

try:
    results_with_score = vectorstore.similarity_search_with_score(query)

    if results_with_score:
        print("搜索结果 (文档内容和相似度分数):")
        for doc, score in results_with_score:
            print(f"  文档内容: {doc.page_content.strip()[:200]}...")
            print(f"  相似度分数: {score:.4f}")
            print("-" * 20)
    else:
        print("未找到相关结果。")
except Exception as e:
    print(f"执行相似性搜索时发生错误: {e}")

4. 注意事项与进阶考量

  • 文本切分策略:chunk_size和chunk_overlap参数对检索效果影响很大。较小的chunk_size可能导致上下文丢失,而较大的chunk_size可能包含过多不相关信息。chunk_overlap有助于在块边界处保持语义连贯性。根据您的数据特性和应用场景,可能需要进行多次试验以找到最佳参数。LangChain还提供了其他切分器,如RecursiveCharacterTextSplitter,可以根据不同的分隔符递归切分。
  • 嵌入模型选择:本教程使用了OpenAI Embeddings,但您也可以选择其他嵌入模型,例如SentenceTransformerEmbeddings(来自langchain_community.embeddings.sentence_transformer),它允许您在本地运行模型,无需外部API调用。选择合适的模型取决于您的性能要求、成本预算和数据类型。
  • Redis连接与索引:确保redis_url正确指向您的Redis实例。index_name是Redis中用于存储和检索向量的索引名称,每次调用from_documents如果索引已存在,会默认覆盖或追加,请根据需要管理索引生命周期。
  • 数据生命周期管理(TTL):原始问题提到了TTL。虽然LangChain的Redis.from_documents方法本身没有直接提供设置单个嵌入或整个索引TTL的参数,但Redis原生支持对键设置过期时间(TTL)。如果您需要为存储在Redis中的嵌入设置生命周期,可以在LangChain完成存储后,通过直接操作Redis客户端(如redis-py库)对相应的键设置TTL,或者在设计数据模型时考虑将TTL逻辑集成到应用程序层面。
  • 性能优化:对于海量数据,批量处理和异步操作可以显著提升存储效率。此外,Redis的硬件配置(内存、CPU)和网络带宽也会影响读写性能。
  • 元数据利用:Redis.from_documents支持传入文档的元数据。在实际应用中,丰富的元数据可以用于过滤、排序或增强检索结果,提高搜索的精确性和用户体验。

5. 总结

通过本教程,我们学习了如何利用LangChain框架,结合Redis向量数据库,构建一个从自定义文本文件到可搜索嵌入的完整流程。这包括文本的加载、智能切分、嵌入生成以及最终的向量存储和相似性搜索。掌握这些技术,您将能够为各种智能应用(如知识库检索、语义问答等)奠定坚实的基础,实现对非结构化文本数据的高效管理和智能利用。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

750

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

635

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号