Skip to main content

MyScale(我的规模)

MyScale是一个基于开源ClickHouse构建的针对AI应用和解决方案进行优化的云数据库。

本笔记本展示了如何使用与MyScale向量数据库相关的功能。

设置环境

pip install clickhouse-connect

我们想要使用OpenAIEmbeddings,所以我们需要获取OpenAI API密钥。

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

有两种设置myscale索引参数的方法。

  1. 环境变量

    在运行应用程序之前,请使用export设置环境变量: export MYSCALE_HOST='<your-endpoints-url>' MYSCALE_PORT=<your-endpoints-port> MYSCALE_USERNAME=<your-username> MYSCALE_PASSWORD=<your-password> ...

    您可以在我们的SaaS上轻松找到您的帐户、密码和其他信息。有关详细信息,请参阅此文档

    MyScaleSettings下的每个属性都可以使用前缀MYSCALE_进行设置,且不区分大小写。

  2. 使用参数创建MyScaleSettings对象

from langchain.vectorstores import MyScale, MyScaleSettings
config = MyScaleSetting(host="<your-backend-url>", port=8443, ...)
index = MyScale(embedding_function, config)
index.add_documents(...)
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import MyScale
from langchain.document_loaders import TextLoader
from langchain.document_loaders import TextLoader

loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()
for d in docs:
d.metadata = {"some": "metadata"}
docsearch = MyScale.from_documents(docs, embeddings)

query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search(query)
print(docs[0].page_content)

获取连接信息和数据模式

print(str(docsearch))

过滤

您可以直接访问myscale SQL的where语句。您可以按照标准SQL编写WHERE子句。

注意:请注意SQL注入,此接口不能直接由最终用户调用。

如果您在设置中自定义了column_map,则可以使用以下方式进行过滤搜索:

from langchain.vectorstores import MyScale, MyScaleSettings
from langchain.document_loaders import TextLoader

loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

for i, d in enumerate(docs):
d.metadata = {"doc_id": i}

docsearch = MyScale.from_documents(docs, embeddings)

带有分数的相似性搜索

返回的距离分数是余弦距离。因此,较低的分数表示更好的匹配。

meta = docsearch.metadata_column
output = docsearch.similarity_search_with_relevance_scores(
"What did the president say about Ketanji Brown Jackson?",
k=4,
where_str=f"{meta}.doc_id<10",
)
for d, dist in output:
print(dist, d.metadata, d.page_content[:20] + "...")

删除数据

docsearch.drop()