Skip to main content
[JaguarDB Vector Database](www.jaguardb.com/windex.html
  1. 它是一个分布式向量数据库
  2. JaguarDB 的”ZeroMove”功能实现了即时水平扩展
  3. 多模态:支持嵌入向量、文本、图像、视频、PDF、音频、时间序列和地理空间数据
  4. 全主节点架构:支持并行读写
  5. 具备异常检测能力
  6. RAG 支持:将 LLM 与私有数据和实时数据相结合
  7. 共享元数据:跨多个向量索引共享元数据
  8. 距离度量:欧氏距离、余弦距离、内积、曼哈顿距离、切比雪夫距离、汉明距离、杰卡德距离、闵可夫斯基距离

前置条件

运行本文件中的示例需要满足以下两个要求。
  1. 你必须安装并配置 JaguarDB 服务器及其 HTTP 网关服务器。 请参阅以下说明: www.jaguardb.com
  2. 你必须安装 JaguarDB 的 HTTP 客户端包:
        pip install -U jaguardb-http-client
    

结合 LangChain 使用 RAG

本节演示如何在 langchain 软件栈中结合 Jaguar 与 LLM 进行对话。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.jaguar import Jaguar
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

"""
将文本文件加载为一组文档
"""
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=300)
docs = text_splitter.split_documents(documents)

"""
实例化 Jaguar 向量存储
"""
### Jaguar HTTP 端点
url = "http://192.168.5.88:8080/fwww/"

### 使用 OpenAI 嵌入模型
embeddings = OpenAIEmbeddings()

### Pod 是向量的数据库
pod = "vdb"

### 向量存储名称
store = "langchain_rag_store"

### 向量索引名称
vector_index = "v"

### 向量索引类型
# cosine: 距离度量
# fraction: 嵌入向量为十进制数
# float: 使用浮点数存储值
vector_type = "cosine_fraction_float"

### 每个嵌入向量的维度
vector_dimension = 1536

### 实例化 Jaguar 存储对象
vectorstore = Jaguar(
    pod, store, vector_index, vector_type, vector_dimension, url, embeddings
)

"""
必须执行登录以授权客户端。
环境变量 JAGUAR_API_KEY 或文件 $HOME/.jagrc
应包含访问 JaguarDB 服务器的 API 密钥。
"""
vectorstore.login()


"""
在 JaguarDB 数据库服务器上创建向量存储。
此操作只需执行一次。
"""
# 向量存储的额外元数据字段
metadata = "category char(16)"

# 存储文本字段的字符数
text_size = 4096

#  在服务器上创建向量存储
vectorstore.create(metadata, text_size)

"""
将文本分割器中的文本添加到我们的向量存储中
"""
vectorstore.add_documents(docs)

""" 获取检索器对象 """
retriever = vectorstore.as_retriever()
# retriever = vectorstore.as_retriever(search_kwargs={"where": "m1='123' and m2='abc'"})

""" 检索器对象可与 LangChain 和 LLM 一起使用 """

与 jaguar 向量存储交互

用户可以直接与 Jaguar 向量存储交互,进行相似性搜索和异常检测。
from langchain_community.vectorstores.jaguar import Jaguar
from langchain_openai import OpenAIEmbeddings

# 实例化 Jaguar 向量存储对象
url = "http://192.168.3.88:8080/fwww/"
pod = "vdb"
store = "langchain_test_store"
vector_index = "v"
vector_type = "cosine_fraction_float"
vector_dimension = 10
embeddings = OpenAIEmbeddings()
vectorstore = Jaguar(
    pod, store, vector_index, vector_type, vector_dimension, url, embeddings
)

# 登录授权
vectorstore.login()

# 创建带有两个元数据字段的向量存储
# 仅需运行一次
metadata_str = "author char(32), category char(16)"
vectorstore.create(metadata_str, 1024)

# 添加文本列表
texts = ["foo", "bar", "baz"]
metadatas = [
    {"author": "Adam", "category": "Music"},
    {"author": "Eve", "category": "Music"},
    {"author": "John", "category": "History"},
]
ids = vectorstore.add_texts(texts=texts, metadatas=metadatas)

#  搜索相似文本
output = vectorstore.similarity_search(
    query="foo",
    k=1,
    metadatas=["author", "category"],
)
assert output[0].page_content == "foo"
assert output[0].metadata["author"] == "Adam"
assert output[0].metadata["category"] == "Music"
assert len(output) == 1

# 带过滤条件的搜索(where)
where = "author='Eve'"
output = vectorstore.similarity_search(
    query="foo",
    k=3,
    fetch_k=9,
    where=where,
    metadatas=["author", "category"],
)
assert output[0].page_content == "bar"
assert output[0].metadata["author"] == "Eve"
assert output[0].metadata["category"] == "Music"
assert len(output) == 1

# 异常检测
result = vectorstore.is_anomalous(
    query="dogs can jump high",
)
assert result is False

# 清除存储中的所有数据
vectorstore.clear()
assert vectorstore.count() == 0

# 完全删除存储
vectorstore.drop()

# 登出
vectorstore.logout()