展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Redis向量数据库文本嵌入存储教程

Redis向量数据库文本嵌入存储教程

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

本文目录

    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 示例内容:

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。