在构建基于向量的文本检索系统时,理解几个核心概念至关重要:
在开始之前,请确保您的开发环境中安装了必要的库,并且 Redis 服务器正在运行。
首先,安装 Langchain、OpenAI 和 Redis 客户端库:
pip install langchain openai redis
确保您的 Redis 服务器正在本地运行(默认端口 6379)。如果您没有运行中的 Redis 实例,可以参考 Redis 官方文档进行安装和启动。
要将本地文本文件(如 .txt 文件)中的内容导入到向量数据库中,我们需要经过加载和分块两个步骤。
TextLoader 是 Langchain 提供的一个文档加载器,用于从本地文件加载文本内容。它能将文件内容读取为 Langchain 的 Document 对象,其中包含文本内容和可选的元数据。
from langchain.document_loaders import TextLoader # 指定您的文本文件路径和编码 # 例如,如果您有一个名为 union.txt 的文件 loader = TextLoader("union.txt", encoding="utf-8") documents = loader.load()
请确保 union.txt 文件存在于您的脚本运行目录或提供完整路径,并指定正确的编码(通常是 utf-8)。
大型文本文件通常需要被分割成较小的、语义完整的块,原因如下:
CharacterTextSplitter 是一个常用的文本分块器,它通过字符计数来分割文本。
from langchain.text_splitter import CharacterTextSplitter # 定义文本分块器 # chunk_size=1000 表示每个块最大1000个字符 # chunk_overlap=0 表示块之间没有重叠 text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) docs = text_splitter.split_documents(documents)
经过此步骤,docs 变量将包含一系列 Langchain Document 对象,每个对象代表原始文本文件中的一个分块。
在文本被加载并分块后,下一步是使用嵌入模型将其转换为向量,并存储到 Redis 向量数据库中。
Langchain 提供了多种嵌入模型的接口。本教程以 OpenAI 的嵌入模型为例,它通过 OpenAIEmbeddings 类进行封装。在使用前,请确保您已设置 OPENAI_API_KEY 环境变量。
from langchain.embeddings import OpenAIEmbeddings # 初始化 OpenAI 嵌入模型 embeddings = OpenAIEmbeddings()
Redis.from_documents 是 Langchain 中一个非常便捷的方法,它能够自动完成以下任务:
from langchain.vectorstores import Redis # 连接 Redis 并存储文档 # redis_url: Redis 服务器的连接地址 # index_name: 在 Redis 中创建的向量索引名称,用于组织和检索数据 vectorstore = Redis.from_documents( docs, embeddings, redis_url="redis://localhost:6379", index_name="users", # 您可以根据需要命名您的索引 ) print(f"成功将 {len(docs)} 个文档块及其嵌入存储到 Redis 索引 '{vectorstore.index_name}' 中。")
执行上述代码后,您的文本数据及其对应的向量嵌入就已经存储在 Redis 向量数据库中,并准备好进行相似度搜索。
一旦数据存储在 Redis 中,您就可以执行相似度搜索来查找与给定查询最相关的文本块。
similarity_search_with_score 方法会根据查询文本生成嵌入,然后在 Redis 向量数据库中查找与其最相似的向量。它返回一个包含匹配文档及其相似度分数的列表。分数越低通常表示相似度越高(具体取决于距离度量方式)。
# 假设您已经初始化了 vectorstore,或者重新连接 # vectorstore = Redis.from_existing_index( # embeddings, # redis_url="redis://localhost:6379", # index_name="users" # ) # 执行相似度搜索 query = "He met the Ukrainian people." results = vectorstore.similarity_search_with_score(query) # 打印搜索结果 print(f"查询 '{query}' 的相似度搜索结果:") for doc, score in results: print(f"文档内容: {doc.page_content[:100]}...") # 打印前100个字符 print(f"相似度分数: {score}\n")
通过这个方法,您可以快速从大量文本数据中找到与用户查询语义最接近的信息。
本教程使用了 Langchain 封装的 OpenAIEmbeddings。Langchain 还支持其他多种嵌入模型,例如来自 Hugging Face 的 SentenceTransformerEmbeddings,或者其他商业 API。
如果您需要使用完全自定义的嵌入逻辑(例如,调用一个不在 Langchain 预设范围内的本地模型),您可能需要手动为每个文本块生成嵌入向量,然后使用 Redis.add_texts 方法来存储,该方法接受文本列表和对应的嵌入向量列表。
# 示例:如果您需要手动生成嵌入并存储 # from openai import OpenAI # client = OpenAI() # def get_embedding(text, model="text-embedding-ada-002"): # text = text.replace("\n", " ") # return client.embeddings.create(input = [text], model=model).data[0].embedding # custom_embeddings = [get_embedding(doc.page_content) for doc in docs] # vectorstore_manual = Redis.from_texts( # [doc.page_content for doc in docs], # embeddings, # 这里的embeddings参数仍然是Langchain的Embeddings对象,用于内部验证或未来扩展 # redis_url="redis://localhost:6379", # index_name="users_manual", # embedding_function=get_embedding # 传入自定义的embedding函数 # ) # 注意:Redis.from_texts 内部已经包含了嵌入生成逻辑,如果传递了 embedding_function 参数,它会使用该函数。 # 更直接的方式是使用 vectorstore.add_texts(texts, embeddings) # vectorstore_manual.add_texts([doc.page_content for doc in docs], custom_embeddings)
通常情况下,建议优先使用 Langchain 提供的嵌入模型接口,它们能更好地与 Langchain 的生态系统集成。
用户有时会关心 Redis 中存储的嵌入数据的生命周期(TTL)。在 Langchain 的 Redis.from_documents 方法中,默认情况下并不会为存储的键设置 TTL。这意味着数据会永久保存在 Redis 中,直到手动删除。
如果需要为存储的嵌入数据设置过期时间,您有以下几种选择:
本教程详细阐述了如何利用 Langchain 框架和 Redis 向量数据库,从本地文本文件构建一个完整的文本嵌入存储与检索系统。我们涵盖了从文件加载、文本分块、嵌入生成到数据存储和相似度搜索的整个流程。通过掌握这些技术,您可以为各种应用场景(如智能问答、内容推荐、语义搜索等)奠定基础,高效地管理和利用非结构化文本数据。
以上就是基于 Langchain 和 Redis 实现文本嵌入的加载、存储与相似度搜索的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号