前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了

Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了

作者头像
一个程序猿的异常
发布2023-12-26 14:49:03
1.6K0
发布2023-12-26 14:49:03
举报

向量数据库简介

在前面的文章我们简单介绍了下什么是向量数据库,用比较生动的三原色的概念进行了类别,可以回顾下之前的文章。

https://mp.weixin.qq.com/s/GGq5U15bOXj0lSNA-zID1Q

向量数据库是什么

向量数据库是一种专为存储、管理和搜索嵌入向量而设计的数据库。

今年,随着AIGC的爆火和人工智能在解决自然语言、图像识别和其他非结构化数据形式的用例方面效果的不断增强,

使用嵌入来编码非结构化数据(文本、音频、视频等)为机器学习模型消费的向量已经迅速普及,向量数据库已成为企业交付和扩展这些

用例的有效解决方案。

向量是指在数学和物理中用来表示大小和方向的量。它由一组有序的数值组成,这些数值代表了向量在每个坐标轴上的分量。

为什么使用向量数据库

向量检索是一种基于向量空间模型的信息检索方法。将非结构化的数据表示为向量存入向量数据库,向量检索通过计算查询向量与数据库中存储的向量的相似度来找到目标向量。

1. 高效的数据检索

向量数据库通过使用向量(数值数组)来表示数据,这使得它们在处理大量复杂数据时表现出高效的检索能力。这种方法特别适合于机器学习和人工智能应用,其中数据的维度和复杂性要求更高效的检索算法。

2. 支持复杂查询

与传统的基于文本的数据库相比,向量数据库能够处理更加复杂的查询。例如,在图像识别或自然语言处理中,向量数据库可以快速地查找与给定图像或文本片段相似的项目,这在关系型数据库中是难以实现的。

3. 提高精度和相关性

通过使用深度学习模型将数据转换为向量,向量数据库能够更准确地捕捉数据之间的细微差别和关联。这意味着它们可以提供更相关和精确的搜索结果,这对于需要高度精准数据匹配的应用至关重要。

4. 灵活性和可扩展性

向量数据库的设计使得它们非常灵活和可扩展。它们可以轻松处理来自不同源的各种类型的数据,并且可以根据需要进行扩展以处理更大规模的数据集。

5. 促进创新

向量数据库的这些特性使其成为推动各种创新应用的强大工具。无论是推荐系统、智能搜索引擎还是先进的分析工具,向量数据库都提供了一种更高效、更准确的方法来处理和分析数据。

向量数据库选型

Openai 官方cookbook 推荐了一些向量数据库,我们本次使用最简单的 Chroma 快速体验下效果

https://cookbook.openai.com/examples/vector_databases/readme

代码语言:javascript
复制
AnalyticDB
Cassandra/Astra DB
AzureSearch
Chroma
Elasticsearch
Hologres
Kusto
Milvus
MyScale
MongoDB
Neon Postgres
Pinecone
PolarDB
Qdrant
Redis
SingleStoreDB
Supabase
Typesense
Weaviate
Zilliz

Chroma

Chroma是一个AI本地的开源嵌入式数据库,它提供了一套简单的工具来使用嵌入式数据。

它支持用于搜索、过滤等的丰富功能,并能与多种平台和工具(如LangChain, LlamaIndex, OpenAI等)集成。

Chroma的核心API包括四个命令,用于创建集合、添加文档、更新和删除,以及执行查询。

安装

代码语言:javascript
复制
pip install chromadb
pip install requests 
pip install beautifulsoup4

数据准备

数据处理的流程是数据下载,数据切片,向量计算,相似度查找(召回),数据投喂,获取结果。

微信公众号内容下载

亦仁:东方甄选的危,是新的起飞机会;我是怎么搭建初创团队的?

我们使用作为案例进行数据下载和切分:https://mp.weixin.qq.com/s/IphmeueRlm8zEBPGMsjABg

代码语言:javascript
复制
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

相似度搜索

代码语言:javascript
复制
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()

到此我们使用了如何使用向量数据库进行搜索。

拿到想要的结果了,接下来该怎么处理呢?下次揭晓答案。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个程序猿的异常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 向量数据库简介
    • 向量数据库是什么
      • 为什么使用向量数据库
        • 1. 高效的数据检索
        • 2. 支持复杂查询
        • 3. 提高精度和相关性
        • 4. 灵活性和可扩展性
        • 5. 促进创新
    • 向量数据库选型
    • Chroma
      • 安装
        • 数据准备
          • 微信公众号内容下载
            • 相似度搜索
            相关产品与服务
            向量数据库
            腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档