在前面的文章我们简单介绍了下什么是向量数据库,用比较生动的三原色的概念进行了类别,可以回顾下之前的文章。
https://mp.weixin.qq.com/s/GGq5U15bOXj0lSNA-zID1Q
向量数据库是一种专为存储、管理和搜索嵌入向量而设计的数据库。
今年,随着AIGC的爆火和人工智能在解决自然语言、图像识别和其他非结构化数据形式的用例方面效果的不断增强,
使用嵌入来编码非结构化数据(文本、音频、视频等)为机器学习模型消费的向量已经迅速普及,向量数据库已成为企业交付和扩展这些
用例的有效解决方案。
向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。
向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。
向量数据库通过使用向量(数值数组)来表示数据,这使得它们在处理大量复杂数据时表现出高效的检索能力。这种方法特别适合于机器学习和人工智能应用,其中数据的维度和复杂性要求更高效的检索算法。
与传统的基于文本的数据库相比,向量数据库能够处理更加复杂的查询。例如,在图像识别或自然语言处理中,向量数据库可以快速地查找与给定图像或文本片段相似的项目,这在关系型数据库中是难以实现的。
通过使用深度学习模型将数据转换为向量,向量数据库能够更准确地捕捉数据之间的细微差别和关联。这意味着它们可以提供更相关和精确的搜索结果,这对于需要高度精准数据匹配的应用至关重要。
向量数据库的设计使得它们非常灵活和可扩展。它们可以轻松处理来自不同源的各种类型的数据,并且可以根据需要进行扩展以处理更大规模的数据集。
向量数据库的这些特性使其成为推动各种创新应用的强大工具。无论是推荐系统、智能搜索引擎还是先进的分析工具,向量数据库都提供了一种更高效、更准确的方法来处理和分析数据。
Openai 官方cookbook 推荐了一些向量数据库,我们本次使用最简单的 Chroma
快速体验下效果
https://cookbook.openai.com/examples/vector_databases/readme
AnalyticDB
Cassandra/Astra DB
AzureSearch
Chroma
Elasticsearch
Hologres
Kusto
Milvus
MyScale
MongoDB
Neon Postgres
Pinecone
PolarDB
Qdrant
Redis
SingleStoreDB
Supabase
Typesense
Weaviate
Zilliz
Chroma是一个AI本地的开源嵌入式数据库,它提供了一套简单的工具来使用嵌入式数据。
它支持用于搜索、过滤等的丰富功能,并能与多种平台和工具(如LangChain, LlamaIndex, OpenAI等)集成。
Chroma的核心API包括四个命令,用于创建集合、添加文档、更新和删除,以及执行查询。
pip install chromadb
pip install requests
pip install beautifulsoup4
数据处理的流程是数据下载,数据切片,向量计算,相似度查找(召回),数据投喂,获取结果。
亦仁:东方甄选的危,是新的起飞机会;我是怎么搭建初创团队的?
我们使用作为案例进行数据下载和切分:https://mp.weixin.qq.com/s/IphmeueRlm8zEBPGMsjABg
from typing import List
from bs4 import BeautifulSoup
import requests
def get_text_chunks_from_url(url: str, max_chunk_size: int = 500) -> List[str]:
def split_text(content: str, max_size: int) -> List[str]:
chunks_ = []
length = len(content)
start = 0
while start < length:
end = start + max_size
if end >= length:
end = length
chunk_ = content[start:end]
chunks_.append(chunk_)
start = end
return chunks_
response = requests.get(url)
if response.status_code == 200:
web_html_data = response.text
soup = BeautifulSoup(web_html_data, 'html.parser')
content = soup.find('div', class_='rich_media_content').text.strip()
chunks = split_text(content, max_chunk_size)
return chunks
else:
print('网页加载失败')
return []
上面代码保存为 down_mp.py
import uuid
import chromadb
from chromadb.utils import embedding_functions
from down_mp import get_text_chunks_from_url
# 指定embedding function使用openai接口能力
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_base="https://api.gptmini.ai/v1",
api_key="sk-XXX",
model_name="text-embedding-ada-002"
)
# 文件存储路径
client = chromadb.PersistentClient(path="/tmp/.chroma")
collection_name = "bf-mp-test"
client.delete_collection(collection_name)
collection = client.get_or_create_collection(name=collection_name, embedding_function=openai_ef)
chunks_from_url = get_text_chunks_from_url('https://mp.weixin.qq.com/s/IphmeueRlm8zEBPGMsjABg', 300)
for chunk in chunks_from_url:
collection.add(
documents=[chunk],
metadatas=[{"mp": "生财有术"}],
ids=[uuid.uuid4().hex],
)
print('add')
# 获取控制台输入
while True:
print('请输入搜索内容')
search_text = input()
results = collection.query(
query_texts=[search_text],
n_results=2,
)
print('search')
print(results)
# {'ids': [['doc1', 'doc2']], 'distances': [[0.4450637689775306, 0.4570213244723775]], 'metadatas': [[{'source': 'notion'}, {'source': 'google-docs'}]], 'embeddings': None, 'documents': [['This is document1', 'This is document2']], 'uris': None, 'data': None}
# 打印 2 个最相似的结果
for i, result in enumerate(results['documents'][0]):
print(f"Result {i}: {result}")
print(f"Distance: {results['distances'][0][i]}")
print(f"Metadata: {results['metadatas'][0][i]}")
print(f"ID: {results['ids'][0][i]}")
print()
到此我们使用了如何使用向量数据库进行搜索。
拿到想要的结果了,接下来该怎么处理呢?下次揭晓答案。