利用 ClickHouse 构建高性能向量数据库:从入门到实战

263 阅读2分钟
# 引言

在现代数据分析和实时应用中,处理大规模向量数据已成为一种趋势。ClickHouse,作为一个开源的高性能数据库,能够以最小的资源消耗支持全SQL的实时应用和分析请求。它近期新增的数据结构和搜索功能,如L2Distance以及近似最近邻搜索索引,使其成为一个可扩展的向量数据库解决方案。本篇文章将介绍如何利用ClickHouse的向量存储功能,管理和查询大规模向量数据。

# 主要内容

## 1. 环境设置

首先,我们需要通过Docker来设置本地的ClickHouse服务器:

```bash
! docker run -d -p 8123:8123 -p9000:9000 --name langchain-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server:23.4.2.11

接下来,安装必要的Python包:

pip install -qU langchain-community clickhouse-connect

2. 向量存储初始化

在进行任何操作之前,我们需要初始化向量存储,这包含选择嵌入模型和配置ClickHouse:

import getpass
from langchain_openai import OpenAIEmbeddings

# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = getpass.getpass()
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

from langchain_community.vectorstores import Clickhouse, ClickhouseSettings

settings = ClickhouseSettings(table="clickhouse_example")
vector_store = Clickhouse(embeddings, config=settings)

3. 管理向量存储

添加文档

我们可以通过add_documents函数向向量存储中添加文档:

from uuid import uuid4
from langchain_core.documents import Document

documents = [
    Document(page_content="I had chocolate chip pancakes for breakfast.", metadata={"source": "tweet"}),
    # 添加更多文档...
]
uuids = [str(uuid4()) for _ in documents]

vector_store.add_documents(documents=documents, ids=uuids)

删除文档

通过文档ID删除向量存储中的项:

vector_store.delete(ids=uuids[-1])

代码示例

以下是一个完整的代码示例,展示如何进行简单的相似性搜索:

results = vector_store.similarity_search(
    "LangChain provides abstractions to make working with LLMs easy", k=2
)

for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

常见问题和解决方案

  • 访问问题:某些地区可能需要使用API代理服务以提高访问稳定性。
  • SQL注入风险:当直接使用SQL查询时,请务必注意防范SQL注入攻击。

总结和进一步学习资源

ClickHouse通过其强大的向量存储能力成为大数据分析的有力工具。要深入了解更多,可以查看以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---