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 示例内容:这是一份关于欧盟历史的综合性文件。它涵盖了欧盟的形成、关键里程碑以及几十年来面临的挑战。欧盟的目标是促进和平、价值观和人民的福祉。它通过标准化的法律体系发展了内部单一市场。欧盟面临着各种挑战,包括经济危机和英国脱欧。尽管如此,它仍然在全球政治和经济中发挥着重要作用。 trade.登录后复制
接下来,使用TextLoader加载文件,并使用CharacterTextSplitter将文档切休息小块。切分是提高检索准确性和效率的关键步骤。from langchain_community.embeddings import OpenAIEmbeddingsfrom langchain_community.vectorstores import Redisfrom langchain_community.document_loaders import TextLoaderfrom langchain_text_splitters import CharacterTextSplitterimport os# 配置OpenAI API 密钥# 请确保您的环境变量中已设置 OPENAI_API_KEY 或在此处直接赋值# os.environ[quot;OPENAI_API_KEYquot;] = quot;YOUR_OPENAI_API_KEYquot; # 1.初始化嵌入模型#使用OpenAIEmbeddings,需要配置OpenAI API Keyembeddings = OpenAIEmbeddings()# 2.加载文本文件#假设您的文本文件名为union.txt且与脚本在相同目录下loader = TextLoader(quot;union.txtquot;,encoding=quot;utf-8quot;)documents = loader.load()# 3. 切分文档# chunk_size 定义每个文本的最大字符数# chunk_overlap 定义上下文块之间的重叠字符数,有助于保持上下文连贯性text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)docs = text_splitter.split_documents(documents)print(fquot;原始文档切暑了 {len(docs)} 个文本块。
quot;)# 打印第一个文本块的内容if docs: print(fquot;第一个文本块内容示例:\n{docs[0].page_content[:200]}...quot;)登录后复制3.3存储嵌入至Redis
切分后的文档列表文档现在可以与嵌入模型一起,通过Redis.from_documents方法存储到Redis支持数据库中。这个方法会自动为每个文档生成嵌入,把文档、元数据和嵌入分别存储。# 4. 文档存储和嵌入到Redis# redis_url 指定Redis服务的地址# index_name 是在Redis中创建的索引名称,用于组织和检索数据向量store = Redis.from_documents( docs, embeddings, redis_url=quot;redis://localhost:6379quot;, index_name=quot;usersquot;, # 建议使用更多描述性的索引名,例如 quot;eu_documentsquot;)print(fquot; success 将 {len(docs)} 个文本块及其嵌入存储索引到Redis '{vectorstore.index_name}'中。quot;)登录后复制3.4执行相似性搜索
一旦数据存储在Redis中,您就可以执行相似性搜索,根据查询文本的相似性来检索相关的文档块。# 5.执行相似性搜索#相似性搜索#similarity_search_with_score返回匹配的文档以及它们的相似性搜索#分数越低表示相似度训练(通常是余弦距离或L2距离,Redis索引配置)query = quot;欧盟的主要目标是什么?quot;#更相关的查询# query = quot;他遇见了乌克兰人民。quot;使用#原问题中的,如果文档不相关,结果可能不理想print(fquot;\n执行查询: '{query}'quot;)results_with_score = vectorstore.similarity_search_with_score(query)# 打印搜索结果 if results_with_score: print(quot;搜索结果 (文档内容和相似度分数):quot;) 对于 doc,在 results_with_score 中得分: print(fquot; 文档内容: {doc.page_content[:150]}...quot;) print(fquot; 相似度分数: {score}quot;) print(quot;-quot; * 20)else: print(quot;未找到相关结果。
quot;)登录后复制
完整示例代码:from langchain_community.embeddings import OpenAIEmbeddingsfrom langchain_community.vectorstores import Redisfrom langchain_community.document_loaders import TextLoaderfrom langchain_text_splitters import CharacterTextSplitterimport os# ---配置部分 ---# 请确保您的环境变量中已设置 OPENAI_API_KEY#或者在此处直接赋值,但不推荐在生产环境直接硬编码# os.environ[quot;OPENAI_API_KEYquot;] = quot;YOUR_OPENAI_API_KEYquot; REDIS_URL = quot;redis://localhost:6379quot;INDEX_NAME = quot;eu_documents_indexquot; #为了使用描述性的索引名TEXT_FILE_PATH = quot;union.txtquot;# --- 1.初始化嵌入模型 ---embeddings = OpenAIEmbeddings()# --- 2. 加载文本文件 ---try: loader = TextLoader(TEXT_FILE_PATH,encoding=quot;utf-8quot;) Documents = loader.load() print(fquot;成功加载文件: {TEXT_FILE_PATH}quot;) except FileNotFoundError: print(fquot;错误:文件 '{TEXT_FILE_PATH}' 未找到。请确保文件。quot;) exit() except Exception as e: print(fquot;加载文件时发生错误: {e}quot;) exit()# --- 3. 切分文档 ---text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) # 调整块大小和重叠docs = text_splitter.split_documents(documents)print(fquot;原始文档切回到了 {len(docs)} 个文本块。quot;)# --- 4.存储文档并嵌入到Redis ---尝试: vectorstore = Redis.from_documents( docs, embeddings, redis_url=REDIS_URL, index_name=INDEX_NAME, ) print(fquot;成功将 {len(docs)} 个文本块及其嵌入存储到 Redis 索引 '{INDEX_NAME}' 中。
quot;) except Exception as e: print(fquot;存储到Redis时发生错误: {e}quot;) print(quot;请检查Redis服务是否运行,以及redis-py和RedisStack是否正确安装。quot;) exit()# --- 5.执行相似性搜索 ---query = quot;欧盟的主要目标是什么?quot; print(fquot;\n执行查询: '{query}'quot;)try: results_with_score = vectorstore.similarity_search_with_score(query) if results_with_score: print(quot;搜索结果 (文档内容和相似度分数):quot;) for doc,分数 results_with_score: print(fquot; 文档内容: {doc.page_content.strip()[:200]}...quot;) print(fquot; 相似度分数: {score:.4f}quot;) print(quot;-quot; * 20) 其他: print(quot;未找到相关结果。quot;) except Exception as e: print(fquot;执行相似性搜索时发生错误: {e}quot;)登录后复制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正确指向您的Redi s实例。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支持数据库,构建一个从自定义文本文件到可嵌入搜索的完整流程。这包括文本的加载、智能切分、嵌入生成以及最终的支持存储和相似搜索。掌握这些技术,您将能够足以为各种智能应用(如知识库检索、语义问答等)打下坚实的高效基础,实现对非结构化文本数据的管理和智能利用。
以上就是Redis支持数据库中高效与检索自定义文本嵌入教程的详细内容,更多请关注乐哥常识网相关文章!