基于Milvus与LangChain创建持久化向量库并实现跨脚本存取
LangChain中Milvus持久化向量库的实现方案
你之前的误解在于对Milvus.from_documents的认知——它并非创建内存向量库,而是连接到你已部署的持久化Milvus实例,只是默认会创建临时集合(脚本结束后自动删除)。只要指定固定的集合名称,就能实现数据持久化,后续脚本可通过该集合名重新连接。
1. 创建持久化向量库并导入数据
修改原代码,添加collection_name参数指定固定集合名,同时设置drop_old=False避免每次运行删除已有数据:
def parseWPDataFile(filename): # redacted for brevity return { 'meta': parsed_headers, 'body': doc_body.strip() } parsed_doc = parseWPDataFile('sample_data.txt') text_splitter = RecursiveCharacterTextSplitter(is_separator_regex=True, separators=['\n+'], chunk_size=5000, length_function=len) docs = text_splitter.create_documents([parsed_doc['body']], [parsed_doc['meta']]) embeddings = OpenAIEmbeddings() # 指定固定集合名,实现持久化 vector_db = Milvus.from_documents( docs, embeddings, connection_args={"host": "127.0.0.1", "port": "19530"}, collection_name="employer_blogs", # 自定义固定集合名 drop_old=False # 不删除已有集合,避免数据丢失 ) # 后续还可以继续添加更多文档 # new_docs = ... # vector_db.add_documents(new_docs)
这段代码会将数据存入Milvus实例中名为employer_blogs的集合,数据会持久保存在你的Milvus部署中(前提是Milvus本身配置了持久化存储,比如Docker部署时挂载了数据卷)。
2. 在独立脚本中加载已有向量库
直接使用Milvus类的构造函数,传入相同的连接参数和集合名,即可获取已有的向量库引用:
from langchain.vectorstores import Milvus from langchain.embeddings import OpenAIEmbeddings embeddings = OpenAIEmbeddings() # 连接到已有的持久化集合 vector_db = Milvus( embedding_function=embeddings, connection_args={"host": "127.0.0.1", "port": "19530"}, collection_name="employer_blogs" ) # 示例:执行查询 query = "如何优化雇主博客的SEO?" docs = vector_db.similarity_search(query) print(docs)
关键说明
- Milvus实例本身是持久化的,只要你部署时配置了数据持久化(比如Docker启动时指定
-v挂载数据目录),集合数据就不会丢失。 drop_old=False非常重要,默认值为True,会删除同名集合,导致之前的数据丢失,所以一定要显式设置为False。- 如果需要向已有集合追加数据,直接调用
vector_db.add_documents(new_docs)即可。
内容的提问来源于stack exchange,提问作者I wrestled a bear once.
相关产品推荐
相关产品推荐

