创建好 Weaviate 数据库服务后,接下来就可以安装 Python 客户端/LangChain 集成包,命令如下:
pip install -Uqq langchain-weaviate
下一步如果使用的是 Weaviate 云服务,可以直接从可视化界面创建 Collection,亦或者在使用时 LangChain 自动检测对应的数据集是否存在,如果不存在则直接创建。
然后就可以考虑连接 Weaviate 服务了,Weaviate 框架针对不同的部署方式提供的不同的连接方法:
weaviate.connect_to_local()
:连接到本地的部署服务,需配置连接 URL、端口号。
weaviate.connect_to_wcs()
:连接到远程的 Weaviate 服务,需配置连接 URL、连接秘钥。
资料推荐
1. 代码示例:
import weaviate
# 连接192.168.2.120:8080并创建weaviate客户端
client = weaviate.connect_to_local("192.168.2.120", "8080")
2. 连接到远程的 Weaviate 服务代码如下:
import weaviate
from weaviate.auth import AuthApiKey
client = weaviate.connect_to_wcs(
cluster_url="https://2j9jgyhprd2yej3c3rwog.c0.us-west3.gcp.weaviate.cloud",
auth_credentials=AuthApiKey("BAn9bGZdZbdGCmUyfdegQoKFctyMmxaQdDFb")
)
创建好客户端后,接下来可以基于客户端创建 LangChain 向量数据库实例,在实例化 LangChain VectorDB 时,需要传递 client(客户端)、 index_name(集合名字)、text(原始文本的存储键)、embedding(文本嵌入模型),如下:
import dotenv
import weaviate
from langchain_openai import OpenAIEmbeddings
from langchain_weaviate import WeaviateVectorStore
dotenv.load_dotenv()
# 1.连接weaviate向量数据库
client = weaviate.connect_to_local("192.168.2.120", "8080")
# 2.实例化WeaviateVectorStore
embedding = OpenAIEmbeddings(model="text-embedding-3-small")
db = WeaviateVectorStore(client=client, index_name="DatasetTest", text_key="text", embedding=embedding)
实例化 LangChain VectorDB 后,就可以像 Faiss、Pinecone、TCVectorDB 一样去使用了,例如执行新增数据后完成检索示例如下:
import dotenv
import weaviate
from langchain_openai import OpenAIEmbeddings
from langchain_weaviate import WeaviateVectorStore
dotenv.load_dotenv()
# 1.连接weaviate向量数据库
client = weaviate.connect_to_local("192.168.2.120", "8080")
# 2.实例化WeaviateVectorStore
embedding = OpenAIEmbeddings(model="text-embedding-3-small")
db = WeaviateVectorStore(client=client, index_name="dataset-test", text_key="text", embedding=embedding)
# 3.新增数据
ids = db.add_texts([
"笨笨是一只很喜欢睡觉的猫咪",
"我喜欢在夜晚听音乐,这让我感到放松。",
"猫咪在窗台上打盹,看起来非常可爱。",
"学习新技能是每个人都应该追求的目标。",
"我最喜欢的食物是意大利面,尤其是番茄酱的那种。",
"昨晚我做了一个奇怪的梦,梦见自己在太空飞行。",
"我的手机突然关机了,让我有些焦虑。",
"阅读是我每天都会做的事情,我觉得很充实。",
"他们一起计划了一次周末的野餐,希望天气能好。",
"我的狗喜欢追逐球,看起来非常开心。",
])
# 4.检索数据
print(db.similarity_search_with_score("笨笨"))
输出结果:
[(Document(page_content='笨笨是一只很喜欢睡觉的猫咪'), 0.699999988079071), (Document(page_content='猫咪在窗台上打盹,看起来非常可爱。'), 0.2090398222208023), (Document(page_content='我的狗喜欢追逐球,看起来非常开心。'), 0.19787956774234772), (Document(page_content='我的手机突然关机了,让我有些焦虑。'), 0.11435992270708084)]
在 Weaviate 中,也支持带过滤器的相似性筛选,并且 LangChain Weaviate 社区包并没有对筛选过滤器进行二次封装,所以直接传递原生的 weaviate 过滤器即可,参考文档:
- https://weaviate.io/developers/weaviate/search/filters
- 💡大模型中转API推荐
- ✨中转使用教程
例如需要检索 page 属性大于等于 5 的所有数据,可以构建一个 filters 后传递给检索方法,如下:
from weaviate.classes.query import Filter
filters = Filter.by_property("page").greater_or_equal(5)
print(db.similarity_search_with_score("笨笨", filters=filters))
输出结果:
[(Document(page_content='我的狗喜欢追逐球,看起来非常开心。', metadata={'page': 10.0, 'account_id': None}), 0.699999988079071), (Document(page_content='我的手机突然关机了,让我有些焦虑。', metadata={'page': 7.0, 'account_id': None}), 0.4045487940311432), (Document(page_content='昨晚我做了一个奇怪的梦,梦见自己在太空飞行。', metadata={'page': 6.0, 'account_id': 1.0}), 0.318904846906662), (Document(page_content='我最喜欢的食物是意大利面,尤其是番茄酱的那种。', metadata={'page': 5.0, 'account_id': None}), 0.2671944797039032)]
如果想获取 Weaviate 原始集合的实例,可以通过 db._collection 快速获得,从而去执行一些原始操作,例如:
from weaviate.classes.query import MetadataQuery
collection = db._collection
response = collection.query.near_text(
query="a sweet German white wine",
limit=2,
target_vector="title_country", # Specify the target vector for named vector collections
return_metadata=MetadataQuery(distance=True)
)
for o in response.objects:
print(o.properties)
print(o.metadata.distance)