IT评测·应用市场-qidao123.com
标题:
选择合适的向量数据库以支持LangChain项目
[打印本页]
作者:
农妇山泉一亩田
时间:
2024-10-12 06:29
标题:
选择合适的向量数据库以支持LangChain项目
概要
在构建基于自然语言处置惩罚的应用步伐时,选择合适的向量数据库对于确保系统的性能和扩展性至关重要。LangChain 支持多种向量数据库,每种都有其独特的特性和实用场景。本文将详细先容LangChain支持的几种向量数据库,并探讨它们各自的长处及实用范围。
技能名词解释
为什么需要向量数据库?
向量数据库是用来存储高维向量数据的数据存储系统,它可以或许快速检索最靠近查询向量的数据点。在自然语言处置惩罚中,文本通常会被嵌入到高维空间中的向量,这些向量可以用来表示文本的意义。因此,向量数据库成为了存储和检索这些嵌入向量的抱负选择。
LangChain支持的向量数据库
LangChain 支持多种向量数据库,以下是一些主要的选择:
Chroma
特点:Chroma 是一个开源的向量数据库,支持本地和云环境部署。
优势:机动的部署选项使其既可以在本地运行也可以在云端运行。
实用场景:实用于那些希望保持数据本地化但又不想牺牲云机动性的项目。
FAISS
特点:FAISS 是 Facebook 开发的一个高效相似度搜刮库。
优势:特殊适合处置惩罚大规模的数据集。
实用场景:当处置惩罚大量文本数据时,FAISS 是一个不错的选择。
Qdrant
特点:Qdrant 是一个开源的向量数据库,支持云托管。
优势:提供了便捷的云托管服务,简化了运维工作。
实用场景:对于那些希望专注于核心业务逻辑而不是基础设施管理的开发者来说非常适合。
Pinecone
特点:Pinecone 是一个提供托管服务的向量数据库。
优势:高性能且易于利用,无需担心后端的维护工作。
实用场景:实用于那些需要快速上线且不想花费太多时间在数据库设置上的项目。
Milvus
特点:Milvus 是一个开源的向量数据库,支持多种向量类型。
优势:除了文本向量外,还可以存储其他类型的向量数据。
实用场景:当项目涉及到多种类型的向量数据时,Milvus 是一个很好的选择。
Weaviate
特点:Weaviate 是一个开源的知识图谱和向量数据库。
优势:支持多种数据类型,可以构建复杂的关系图谱。
实用场景:实用于需要存储和检索具有复杂关系的数据集。
Redis
特点:Redis 是一个内存中的数据布局存储系统,支持向量存储功能。
优势:利用Redis的强盛性能优势,可以实现快速的向量检索。
实用场景:实用于需要高速数据访问的实时应用场景。
如何选择合适的向量数据库
选择合适的向量数据库时,需要考虑以下几个因素:
数据规模:假如你的数据集非常大,那么像 FAISS 或 Pinecone 这样的办理方案大概会更适合。
部署环境:假如你倾向于利用本地部署,Chroma 或 Milvus 大概是好的选择;假如你偏好云服务,则 Pinecone 或 Qdrant 更合适。
预算和维护本钱:托管服务如 Pinecone 固然方便,但大概需要付出一定的费用。自托管方案如 Chroma 则需要自己维护服务器。
数据类型:假如你的数据不仅仅是文本向量,Milvus 和 Weaviate 提供了更多的数据类型支持。
实现方式
from langchain_community.vectorstores import Chroma
from langchain_core.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
def create_chroma_vector_db():
# 创建示例文档
docs = [
Document(page_content="一群科学家带回恐龙爆发了混乱", metadata={"year": 1993, "rating": 7.7, "genre": "科幻小说"}),
Document(page_content="故事发生在1920年北洋年间中国南方,马邦德花钱买官,购得“萨南康省”的县长一职,坐“马拉的火车”赴任途中遭马匪张麻子一行人伏击", metadata={"year": 2010, "director": "姜文", "rating": 8.2}),
Document(page_content="话说孙悟空护送唐三藏前往西天取经,半路却和牛魔王合谋要杀害唐三藏,并偷走了紫霞仙子持有的月光宝盒。观音闻讯赶到,欲除掉孙悟空以免危害苍生。唐三藏慈悲为怀,愿意一命赔一命,感化劣徒,观音遂令孙悟空五百年后投胎做人,赎其罪孽。", metadata={"year": 1994, "director": "刘镇伟", "rating": 8.6}),
Document(page_content="故事背景设定在2075年,讲述了太阳即将毁灭,毁灭之后的太阳系已经不适合人类生存,而面对绝境,人类将开启“流浪地球”计划,试图带着地球一起逃离太阳系,寻找人类新家园的故事。", metadata={"year": 2019, "director": "郭帆", "rating": 8.3}),
Document(page_content="该片讲述了耿浩和好哥们郝义一场荒诞而有趣的‘寻爱之旅’。该片采用双线叙事的手法,以耿浩和康小雨婚姻破裂为叙事的起点,在郝义携耿浩前往剧组送道具途中‘寻爱’的故事中,穿插着昔日康小雨孤身前往大理并与耿浩相遇的前尘往事,讲述着在现代生活中不同人群对婚姻、生活与理想的不同追求。", metadata={"year": 2014, "genre": "喜剧"}),
]
# 加载预训练的嵌入模型
embeddings_path = "D:\\ai\\download\\bge-large-zh-v1.5"
embeddings = HuggingFaceEmbeddings(model_name=embeddings_path)
# 创建 Chroma 向量数据库
collection_name = "movies"
vector_store = Chroma.from_documents(documents=docs, embedding=embeddings, collection_name=collection_name)
return vector_store
# 创建 Chroma 向量数据库
chroma_vector_store = create_chroma_vector_db()
# 查询示例
def query_chroma_vector_db(query_text):
# 查询向量数据库
results = chroma_vector_store.similarity_search(query_text, k=2)
for result in results:
print(f"Content: {result.page_content}")
print(f"Metadata: {result.metadata}")
print("---------")
# 调用查询方法
query_chroma_vector_db("给我推荐一部评分8.5以上的电影")
复制代码
import numpy as np
import faiss
from langchain_core.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
def create_faiss_vector_db():
# 创建示例文档
docs = [
Document(page_content="一群科学家带回恐龙爆发了混乱", metadata={"year": 1993, "rating": 7.7, "genre": "科幻小说"}),
Document(page_content="故事发生在1920年北洋年间中国南方,马邦德花钱买官,购得“萨南康省”的县长一职,坐“马拉的火车”赴任途中遭马匪张麻子一行人伏击", metadata={"year": 2010, "director": "姜文", "rating": 8.2}),
Document(page_content="话说孙悟空护送唐三藏前往西天取经,半路却和牛魔王合谋要杀害唐三藏,并偷走了紫霞仙子持有的月光宝盒。观音闻讯赶到,欲除掉孙悟空以免危害苍生。唐三藏慈悲为怀,愿意一命赔一命,感化劣徒,观音遂令孙悟空五百年后投胎做人,赎其罪孽。", metadata={"year": 1994, "director": "刘镇伟", "rating": 8.6}),
Document(page_content="故事背景设定在2075年,讲述了太阳即将毁灭,毁灭之后的太阳系已经不适合人类生存,而面对绝境,人类将开启“流浪地球”计划,试图带着地球一起逃离太阳系,寻找人类新家园的故事。", metadata={"year": 2019, "director": "郭帆", "rating": 8.3}),
Document(page_content="该片讲述了耿浩和好哥们郝义一场荒诞而有趣的‘寻爱之旅’。该片采用双线叙事的手法,以耿浩和康小雨婚姻破裂为叙事的起点,在郝义携耿浩前往剧组送道具途中‘寻爱’的故事中,穿插着昔日康小雨孤身前往大理并与耿浩相遇的前尘往事,讲述着在现代生活中不同人群对婚姻、生活与理想的不同追求。", metadata={"year": 2014, "genre": "喜剧"}),
]
# 加载预训练的嵌入模型
embeddings_path = "D:\\ai\\download\\bge-large-zh-v1.5"
embeddings = HuggingFaceEmbeddings(model_name=embeddings_path)
# 计算文档的嵌入向量
embeddings_list = [embeddings.embed_documents([doc.page_content])[0] for doc in docs]
# 创建 FAISS 向量数据库
d = len(embeddings_list[0]) # 向量维度
index = faiss.IndexFlatL2(d) # 使用 L2 距离度量
index.add(np.array(embeddings_list).astype('float32')) # 添加向量到索引
# 创建文档 ID 映射
id_to_doc = {i: doc for i, doc in enumerate(docs)}
return index, id_to_doc
# 创建 FAISS 向量数据库
faiss_index, id_to_doc = create_faiss_vector_db()
# 查询示例
def query_faiss_vector_db(query_text, k=2):
# 计算查询向量
query_embedding = np.array([embeddings.embed_query(query_text)]).astype('float32')
# 搜索向量数据库
D, I = faiss_index.search(query_embedding, k)
# 获取结果
results = [id_to_doc[i] for i in I[0]]
for result in results:
print(f"Content: {result.page_content}")
print(f"Metadata: {result.metadata}")
print("---------")
# 调用查询方法
query_faiss_vector_db("给我推荐一部评分8.5以上的电影")
复制代码
代码解释
创建 Chroma 向量数据库:
利用 Chroma.from_documents 方法创建向量数据库,并将文档和嵌入模型传入。
查询 Chroma 数据库利用 similarity_search 方法,传入查询文本和返回的数量 k。
创建 FAISS 向量数据库:
利用 FAISS 的 IndexFlatL2 创建索引,并将文档的嵌入向量添加到索引中。
查询 FAISS 数据库利用 search 方法,传入查询向量和返回的数量 k。
利用 id_to_doc 映射从索引返回的 ID 获取对应的文档。
小结
选择正确的向量数据库对于构建高效且可扩展的自然语言处置惩罚应用至关重要。LangChain 提供了多种选择,使得开发者可以根据项目的具体需求来挑选最适合的办理方案。希望本文可以或许帮助你在众多选项中做出明智的选择。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4