前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >向量数据库Chroma极简教程

向量数据库Chroma极简教程

作者头像
Rude3Knife的公众号
发布于 2023-11-08 11:37:45
发布于 2023-11-08 11:37:45
2.2K00
代码可运行
举报
文章被收录于专栏:后端技术漫谈后端技术漫谈
运行总次数:0
代码可运行

引子

向量数据库其实最早在传统的人工智能机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding)算法转变为向量数据,然后存储在Chroma等向量数据库中。当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。

由于大模型的火热,现在市面上的向量数据库众多,主流的向量数据库对比如下所示:

向量数据库

URL

GitHub Star

Language

chroma

https://github.com/chroma-core/chroma

7.4K

Python

milvus

https://github.com/milvus-io/milvus

21.5K

Go/Python/C++

pinecone

https://www.pinecone.io/

qdrant

https://github.com/qdrant/qdrant

11.8K

Rust

typesense

https://github.com/typesense/typesense

12.9K

C++

weaviate

https://github.com/weaviate/weaviate

6.9K

Go

表格引用自:一文全面了解向量数据库的基本概念、原理、算法、选型

本文重点围绕向量数据库Chroma的使用和实战,主要包括以下内容:

  • Chroma设计理念
  • Chroma常见概念(数据集,文档,存储,查询,条件过滤)
  • Chroma快速上手
  • Chroma支持的Embeddings算法
  • 实战:在Langchain中使用Chroma对中国古典四大名著进行相似性查询

Chroma快速上手

设计理念

Chroma的目标是帮助用户更加便捷地构建大模型应用,更加轻松的将知识(knowledge)、事实(facts)和技能(skills)等我们现实世界中的文档整合进大模型中。

Chroma提供的工具:

  • 存储文档数据和它们的元数据:store embeddings and their metadata
  • 嵌入:embed documents and queries
  • 搜索:search embeddings

Chroma的设计优先考虑:

  • 足够简单并且提升开发者效率:simplicity and developer productivity
  • 搜索之上再分析:analysis on top of search
  • 追求快(性能):it also happens to be very quick

目前官方提供了Python和JavaScript版本,也有其他语言的社区版本支持。

完整Demo

首先需要Python环境(Chroma官方原生支持Python和JavaScript,本文用Python做示例)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install chromadb

直接运行如下代码,便是一个完整的Demo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import chromadb
chroma_client = chromadb.Client()

collection = chroma_client.create_collection(name="my_collection")

collection.add(
    documents=["This is a document about engineer", "This is a document about steak"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

results = collection.query(
    query_texts=["Which food is the best?"],
    n_results=2
)

print(results)

上面的代码中,我们向Chroma提交了两个文档(简单起见,是两个字符串),一个是This is a document about engineer,一个是This is a document about steak。若在add方法没有传入embedding参数,则会使用Chroma默认的all-MiniLM-L6-v2 方式进行embedding。随后,我们对数据集进行query,要求返回两个最相关的结果。提问内容为:Which food is the best?

返回结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 'ids': [
  ['id2', 'id1']
 ],
 'distances': [
  [1.5835548639297485, 2.1740970611572266]
 ],
 'metadatas': [
  [{
   'source': 'doc2'
  }, {
   'source': 'doc1'
  }]
 ],
 'embeddings': None,
 'documents': [
  ['This is a document about steak', 'This is a document about engineer']
 ]
}

结果显示,两个文档都被正确返回,且id2由于是steak(牛排),相关性与我们的提问更大,排在了首位。还打印了distances。

简单,易理解。

数据持久化

Chroma一般是直接作为内存数据库使用,但是也可以进行持久化存储。

在初始化Chroma Client时,使用PersistentClient:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client = chromadb.PersistentClient(path="/Users/yourname/xxxx")

这样在运行代码后,在你指定的位置会新建一个chroma.sqlite3文件。

这个sqlite3的数据库里包含的表如下图,从中可以窥见一部分Chroma的数据存储思路:

Chroma Client还支持下面两个API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.heartbeat() # returns a nanosecond heartbeat. Useful for making sure the client remains connected.
client.reset() # Empties and completely resets the database. ⚠️ This is destructive and not reversible.

此外,Chroma还支持服务端,客户端模式,用于跨进程通信。详见:

https://docs.trychroma.com/usage-guide#running-chroma-in-clientserver-mode

数据集(Collection)

collection是Chroma中一个重要的概念,下面的代码和注释简单介绍了collection的主要功能和使用方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection = client.get_collection(name="test") # Get a collection object from an existing collection, by name. Will raise an exception if it's not found.
collection = client.get_or_create_collection(name="test") # Get a collection object from an existing collection, by name. If it doesn't exist, create it.
client.delete_collection(name="my_collection") # Delete a collection and all associated embeddings, documents, and metadata. ⚠️ This is destructive and not reversible
collection.peek() # returns a list of the first 10 items in the collection
collection.count() # returns the number of items in the collection
collection.modify(name="new_name") # Rename the collection

collection支持传入一些自身的元数据metadata:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection = client.create_collection(
    name="collection_name",
    metadata={"hnsw:space": "cosine"} # l2 is the default
)

collection允许用户自行切换距离计算函数,方法是通过设置cellection的metadata中的“hnsw:space”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection = client.create_collection(
      name="collection_name",
      metadata={"hnsw:space": "cosine"} # l2 is the default
  )

Distance

parameter

Equation

Squared L2

'l2'

Inner product

'ip'

Cosine similarity

'cosine'

文档(Document)

在上面的Demo中,我们使用了默认的add函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(ids: OneOrMany[ID],
        embeddings: Optional[OneOrMany[Embedding]] = None,
        metadatas: Optional[OneOrMany[Metadata]] = None,
        documents: Optional[OneOrMany[Document]] = None) -> None

除此之外,你还可以有如下传参:

  • ids: 文档的唯一ID
  • embeddings(可选): 如果不传该参数,将根据Collection设置的embedding_function进行计算。
  • metadatas(可选):要与嵌入关联的元数据。在查询时,您可以根据这些元数据进行过滤。
  • documents(可选):与该嵌入相关联的文档,甚至可以不放文档。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.add(
    embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    documents=["This is a document", "This is another document"],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)

简单查询

输入文档内的文本进行相似性查询,可以使用query方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

若想要通过id查找,可以使用get方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.get(
    ids=["id1", "id2", "id3", ...],
    where={"style": "style1"}
)

与此同时,你可以定制返回结果包含的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Only get documents and ids
collection.get({
    include: [ "documents" ]
})

collection.query({
    queryEmbeddings: [[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    include: [ "documents" ]
})

条件查询

Chroma 支持按元数据和文档内容过滤查询。

where 字段用于按元数据进行过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "metadata_field": {
        <Operator>: <Value>
    }
}

支持下列操作操作符:

$eq - equal to (string, int, float) $ne - not equal to (string, int, float) $gt - greater than (int, float) $gte - greater than or equal to (int, float) $lt - less than (int, float) $lte - less than or equal to (int, float)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# is equivalent to
{
    "metadata_field": {
        "$eq": "search_string"
    }
}

where_document 字段用于按文档内容进行过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Filtering for a search_string
{
    "$contains": "search_string"
}

使用逻辑运算符

可以在查询条件中使用逻辑运算符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "$and": [
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        },
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        }
    ]
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "$or": [
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        },
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        }
    ]
}

使用in/not in

in将返回metadata中包含给出列表中属性值的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "metadata_field": {
    "$in": ["value1", "value2", "value3"]
  }
}

not in则与其相反:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "metadata_field": {
    "$nin": ["value1", "value2", "value3"]
  }
}

更新文档

带上ids,其他参数和add方法类似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.update(
    ids=["id1", "id2", "id3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

删除文档

提供ids,还允许附带where条件进行删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

Chroma Embeddings算法

默认Embeddings算法

Chroma默认使用的是all-MiniLM-L6-v2模型来进行embeddings

官方预训练模型

你也可以直接使用官方预训练的托管在Huggingface上的模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('model_name')

The all-* models where trained on all available training data (more than 1 billion training pairs) and are designed as general purpose models. The all-mpnet-base-v2 model provides the best quality, while all-MiniLM-L6-v2 is 5 times faster and still offers good quality. Toggle All models to see all evaluated models or visit HuggingFace Model Hub to view all existing sentence-transformers models.

选择非常多,你可以点击官网查看每种预训练模型的详细信息。

https://www.sbert.net/docs/pretrained_models.html

其他第三方Embeddings算法

你还可以使用其他第三方模型,包括第三方平台,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key="YOUR_API_KEY",
                model_name="text-embedding-ada-002"
            )

其他包括Cohere,HuggingFace等。

自定义Embeddings算法

你甚至可以使用自己的本地Embeddings算法,Chroma留有扩展点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from chromadb import Documents, EmbeddingFunction, Embeddings

class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, texts: Documents) -> Embeddings:
        # embed the documents somehow
        return embeddings

实战:在Langchain中使用Chroma对中国古典四大名著进行相似性查询

很多人认识Chroma是由于Langchain经常将其作为向量数据库使用。不过Langchain官方文档里的Chroma示例使用的是英文Embeddings算法以及英文的文档语料,

既然我们是华语区博客,这本篇文章中,我们就尝试用中文的语料和Embeddings算法来做一次实战。

先贴上完整代码,我们再来逐步解释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from langchain.document_loaders import TextLoader
from langchain.embeddings import ModelScopeEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
import chardet

# 读取原始文档
raw_documents_sanguo = TextLoader('/Users/rude3knife/Desktop/三国演义.txt', encoding='utf-16').load()
raw_documents_xiyou = TextLoader('/Users/rude3knife/Desktop/西游记.txt', encoding='utf-16').load()

# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)
documents_sanguo = text_splitter.split_documents(raw_documents_sanguo)
documents_xiyou = text_splitter.split_documents(raw_documents_xiyou)
documents = documents_sanguo + documents_xiyou
print("documents nums:", documents.__len__())


# 生成向量(embedding)
model_id = "damo/nlp_corom_sentence-embedding_chinese-base"
embeddings = ModelScopeEmbeddings(model_id=model_id)
db = Chroma.from_documents(documents, embedding=embeddings)

# 检索
query = "美猴王是谁?"
docs = db.similarity_search(query, k=5)

# 打印结果
for doc in docs:
    print("===")
    print("metadata:", doc.metadata)
    print("page_content:", doc.page_content)

准备原始文档

我下载了三国演义和西游记的全文本txt,作为我们的知识库,两个文本都在1.5MB左右。

在这里还遇到一个小插曲,本以为下载下来的文本时UTF-8编码,代码写成了encoding='utf-8',结果TextLoader怎么读取都报编码错误,用眼睛也没法一下子判断是什么编码,问了GPT,可以用Python的chardet编码库判断。如果你也遇到同样的问题,可以也尝试用该方法获取编码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import chardet

def detect_file_encoding(file_path):
    with open(file_path, 'rb') as f:
        result = chardet.detect(f.read())
    return result['encoding']

file_path = '/Users/rude3knife/Desktop/三国演义.txt'
encoding = detect_file_encoding(file_path)
print(f'The encoding of file {file_path} is {encoding}')

# 输出
The encoding of file /Users/yangzhendong/Desktop/三国演义.txt is UTF-16

分隔文档

通常来说文档都是很大的,比如名著小说,法律文档,我们通过langchain提供的CharacterTextSplitter来帮我们分割文本:

text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)

embedding

我们选择魔搭平台ModelScope里的通用中文embeddings算法(damo/nlp_corom_sentence-embedding_chinese-base)来作为我们的embedding算法。他有768维的向量。

为啥要选择魔搭而不选择Huggingface,因为...在代码里跑Langchain,连魔搭平台比较快,连不上Huggingface的原因你懂得。而且魔搭毕竟是达摩院的,自家人平台的还得支持一下。

query

将两个文档准备好后,我们进行提问,“美猴王是谁?” 要求返回5个相似答案。下面的返回的答案,可以看到,5个文档都是取自西游记.txt中的文本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==========
metadata: {'source': '/Users/yangzhendong/Desktop/西游记.txt'}
page_content: 美猴王一见,倒身下拜,磕头不计其数,口中只道:“师父,师父!我弟子志心朝礼,志心朝礼!”祖师道:“你是那方人氏?且说个乡贯姓名明白,再拜。”猴王道:“弟子乃东胜神洲傲来国花果山水帘洞人氏。”祖师喝令:“赶出去!他本是个撒诈捣虚之徒,那里修什么道果!”猴王慌忙磕头不住道:“弟子是老实之言,决无虚诈。”祖师道:“你既老实,怎么说东胜神洲?那去处到我这里,隔两重大海,一座南赡部洲,如何就得到此?”猴王叩头道:“弟子飘洋过海,登界游方,有十数个年头,方才访到此处。”祖师道:“既是逐渐行来的也罢。你姓什么?”猴王又道:“我无性。人若骂我我也不恼,若打我我也不嗔,只是陪个礼儿就罢了,一生无性。”祖师道:“不是这个性。你父母原来姓什么?”猴王道:“我也无父母。”祖师道:“既无父母,想是树上生的?”猴王道:“我虽不是树上生,却是石里长的。我只记得花果山上有一块仙石,其年石破,我便生也。”祖师闻言暗喜道:“这等说,却是个天地生成的,你起来走走我看。”猴王纵身跳起,拐呀拐的走了两遍。
==========
metadata: {'source': '/Users/yangzhendong/Desktop/西游记.txt'}
page_content: 太宗更喜,教:“光禄寺设宴,开东阁酬谢。”忽见他三徒立在阶下,容貌异常,便问:“高徒果外国人耶?”长老俯伏道:“大徒弟姓孙,法名悟空,臣又呼他为孙行者。他出身原是东胜神洲傲来国花果山水帘洞人氏,因五百年前大闹天宫,被佛祖困压在西番两界山石匣之内,蒙观音菩萨劝善,情愿皈依,是臣到彼救出,甚亏此徒保护。二徒弟姓猪,法名悟能,臣又呼他为猪八戒。他出身原是福陵山云栈洞人氏,因在乌斯藏高老庄上作怪,即蒙菩萨劝善,亏行者收之,一路上挑担有力,涉水有功。三徒弟姓沙,法名悟净,臣又呼他为沙和尚。他出身原是流沙河作怪者,也蒙菩萨劝善,秉教沙门。那匹马不是主公所赐者。”太宗道:“毛片相同,如何不是?”三藏道:“臣到蛇盘山鹰愁涧涉水,原马被此马吞之,亏行者请菩萨问此马来历,原是西海龙王之了,因有罪,也蒙菩萨救解,教他与臣作脚力。当时变作原马,毛片相同。幸亏他登山越岭,跋涉崎岖,去时骑坐,来时驮经,亦甚赖其力也。”
==========
metadata: {'source': '/Users/yangzhendong/Desktop/西游记.txt'}
page_content: 第七十回 妖魔宝放烟沙火 悟空计盗紫金铃

  却说那孙行者抖擞神威,持着铁棒,踏祥光起在空中,迎面喝道:“你是那里来的邪魔,待往何方猖獗!”那怪物厉声高叫道:“吾党不是别人,乃麒麟山獬豸洞赛太岁大王爷爷部下先锋,今奉大王令,到此取宫女二名,伏侍金圣娘娘。你是何人,敢来问我!”行者道:“吾乃齐天大圣孙悟空,因保东土唐僧西天拜佛,路过此国,知你这伙邪魔欺主,特展雄才,治国祛邪。正没处寻你,却来此送命!”那怪闻言,不知好歹,展长枪就刺行者。行者举铁棒劈面相迎,在半空里这一场好杀:

  棍是龙宫镇海珍,枪乃人间转炼铁。凡兵怎敢比仙兵,擦着些儿神气泄。大圣原来太乙仙,妖精本是邪魔孽。鬼祟焉能近正人,一正之时邪就灭。那个弄风播土唬皇王,这个踏雾腾云遮日月。丢开架子赌输赢,无能谁敢夸豪杰!还是齐天大圣能,乒乓一棍枪先折。
==========
metadata: {'source': '/Users/yangzhendong/Desktop/西游记.txt'}
page_content: 菩萨引众同入里面,与玉帝礼毕,又与老君、王母相见,各坐下,便问:“蟠桃盛会如何?”玉帝道:“每年请会,喜喜欢欢,今年被妖猴作乱,甚是虚邀也。”菩萨道:“妖猴是何出处?”玉帝道:“妖猴乃东胜神洲傲来国花果山石卵化生的。当时生出,即目运金光,射冲斗府。始不介意,继而成精,降龙伏虎,自削死籍。当有龙王、阎王启奏。朕欲擒拿,是长庚星启奏道:‘三界之间,凡有九窍者,可以成仙。’朕即施教育贤,宣他上界,封为御马监弼马温官。那厮嫌恶官小,反了天宫。即差李天王与哪吒太子收降,又降诏抚安,宣至上界,就封他做个‘齐天大圣’,只是有官无禄。他因没事干管理,东游西荡。朕又恐别生事端,着他代管蟠桃园。他又不遵法律,将老树大桃,尽行偷吃。及至设会,他乃无禄人员,不曾请他,他就设计赚哄赤脚大仙,却自变他相貌入会,将仙肴仙酒尽偷吃了,又偷老君仙丹,又偷御酒若干,去与本山众猴享乐。朕心为此烦恼,故调十万天兵,天罗地网收伏。这一日不见回报,不知胜负如何。”
==========
metadata: {'source': '/Users/yangzhendong/Desktop/西游记.txt'}
page_content: 行者道:“实不瞒师父说,老孙五百年前,居花果山水帘洞大展英雄之际,收降七十二洞邪魔,手下有四万七千群怪,头戴的是紫金冠,身穿的是赭黄袍,腰系的是蓝田带,足踏的是步云履,手执的是如意金箍棒,着实也曾为人。自从涅脖罪度,削发秉正沙门,跟你做了徒弟,把这个金箍儿勒在我头上,若回去,却也难见故乡人。师父果若不要我,把那个《松箍儿咒》念一念,退下这个箍子,交付与你,套在别人头上,我就快活相应了,也是跟你一场。莫不成这些人意儿也没有了?”唐僧大惊道:“悟空,我当时只是菩萨暗受一卷《紧箍儿咒》,却没有什么松箍儿咒。”行者道:“若无《松箍儿咒》,你还带我去走走罢。”长老又没奈何道:“你且起来,我再饶你这一次,却不可再行凶了。”行者道:“再不敢了,再不敢了。”又伏侍师父上马,剖路前进。

  却说那妖精,原来行者第二棍也不曾打杀他。那怪物在半空中,夸奖不尽道:“好个猴王,着然有眼!我那般变了去,他也还认得我。这些和尚,他去得快,若过此山,西下四十里,就不伏我所管了。若是被别处妖魔捞了去,好道就笑破他人口,使碎自家心,我还下去戏他一戏。”好妖怪,按耸阴风,在山坡下摇身一变,变成一个老公公,真个是:

总结

目前向量数据库在AI中的应用越来越重要,但很多厂商更倾向于将向量数据库隐藏在产品内部,用户感知不到很多向量数据库的使用细节。但大模型的学习终究是建立在开源代码之上的,学习Chroma可以让我们快速了解向量数据库的基本原理,也有利于我们未来更好地理解大模型。

参考

https://guangzhengli.com/blog/zh/vector-database/#%E7%89%B9%E5%BE%81%E5%92%8C%E5%90%91%E9%87%8F

https://luxiangdong.com/2023/09/19/emb/#/Redis-VSS%E6%BC%94%E7%A4%BA

https://blog.csdn.net/engchina/article/details/131868860

https://github.com/chroma-core/chroma

https://docs.trychroma.com/ - END -

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

本文分享自 后端技术漫谈 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
商业实战将归巢网内容构建为本地RAG模型的完整指南01-优雅草卓伊凡
今天卓伊凡收到了老客户归巢网关于对本地RAG模型建立的咨询,这点也让卓伊凡得深入研究下,毕竟老客户肯定不是说着玩的,主要最终实现目的是建立模型开始使用AI智能问答。
卓伊凡
2025/05/06
920
【RAG落地利器】向量数据库Chroma入门教程
官方有pip安装的方式,为了落地使用,我们还是采用Docker部署的方式,参考链接来自官方部署:
致Great
2025/01/23
1.9K0
【RAG落地利器】向量数据库Chroma入门教程
Chroma 初探:面向 LLM 的开源向量数据库
Chroma 是一个开源的嵌入式数据库,通过使知识、事实和技能可以插入到 LLM 中,从而轻松构建 LLM 应用程序。这里可以了解它的工作原理。
云云众生s
2024/03/27
1.6K0
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
在前面的文章我们简单介绍了下什么是向量数据库,用比较生动的三原色的概念进行了类别,可以回顾下之前的文章。
一个程序猿的异常
2023/12/26
3.6K0
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
Chroma 向量数据入门
🌟Chroma是一个文档检索系统,它存储了一组文档以及它们相应的嵌入向量。当接收到嵌入向量后,Chroma会根据其内部的索引结构快速查找最相关的文档。
@小森
2024/09/27
2460
Chroma 向量数据入门
Chroma数据库:使用指南与实践案例
Chroma 是一种高效的、基于 Python 的、用于大规模相似性搜索的数据库。它的设计初衷是为了解决在大规模数据集中进行相似性搜索的问题,特别是在需要处理高维度数据时。Chroma 的核心是 HNSW(Hierarchical Navigable Small World)算法,这是一种高效的近似最近邻搜索算法,可以在大规模数据集中实现快速的相似性搜索。
TechHarmony
2024/04/11
7.5K0
面向AI的开发:从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
京东技术
2024/06/11
1.7K0
面向AI的开发:从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用
【LangChain系列】第四节:向量数据库与嵌入
在这篇博文中,我们将探讨向量存储和嵌入,它们是构建聊天机器人和对数据语料库执行语义搜索的最重要组件。
Freedom123
2024/05/20
5550
教程:使用 Chroma 和 OpenAI 构建自定义问答机器人
翻译自 Tutorial: Use Chroma and OpenAI to Build a Custom Q&A Bot 。
云云众生s
2024/03/27
6070
教程:使用 Chroma 和 OpenAI 构建自定义问答机器人
【RAG入门教程02】Langchian的Embedding介绍与使用
词向量是 NLP 中的一种表示形式,其中词汇表中的单词或短语被映射到实数向量。它们用于捕获高维空间中单词之间的语义和句法相似性。
致Great
2024/06/10
4570
【RAG入门教程02】Langchian的Embedding介绍与使用
Jina AI + Milvus Lite:搭建 RAG 问答机器人
开发人员特别重视那些易于设置、启动迅速且能在生产环境中无缝扩展的基础组件。针对这一需求,我们推出了最新的轻量级向量数据库产品——Milvus Lite。对于 Python 开发者而言,Milvus Lite 是一个极具价值的工具,尤其适用于追求高质量、易用性的搜索应用。
Zilliz RDS
2024/06/25
4770
Jina AI + Milvus Lite:搭建 RAG 问答机器人
【RAG入门教程05】Langchian框架-Vector Stores
向量存储旨在高效处理大量向量,提供根据特定标准添加、查询和检索向量的功能。它可用于支持语义搜索等应用程序,在这些应用程序中,您可以查找与给定查询在语义上相似的文本段落或文档。
致Great
2024/06/10
5720
【RAG入门教程05】Langchian框架-Vector Stores
向量检索(RAG)之向量数据库研究
研究内容主要包括:是否开源,支持的功能有哪些(是否支持暴力检索,支持哪些索引),是否有可视化界面,是否支持标量过滤。
码之有理
2025/03/05
9110
腾讯向量数据库——Embedding
Embedding 功能提供将非结构化数据转换为向量数据的能力,自动将原始文本转换为向量数据后插入数据库或进行相似性计算,更简单地使用向量数据库。
红目香薰
2023/11/19
1.3K0
腾讯向量数据库——Embedding
ChatGLM实战:用Langchain-ChatGLM解析小说《天龙八部》
上一章我们介绍了《如何使用Transformers加载和运行预训练的模型》,实现了与GPT模型的对话和咨询功能。然而,这种原生模型的知识是有限的,它无法对一些未知内容做出准确的回答,比如最新的时事、小众的小说,以及法院档案中的案件等。通过使用Langchain,我们有可能使GPT模型能够理解文章内容并进行分析,从而弥补这一限制。
MavenTalker
2023/09/06
1.3K0
ChatGLM实战:用Langchain-ChatGLM解析小说《天龙八部》
【腾讯云云上实验室】用向量数据库——实现高效文本检索功能
想必各位开发者一定使用过关系型数据库MySQL去存储我们的项目的数据,也有部分人使用过非关系型数据库Redis去存储我们的一些热点数据作为缓存,提高我们系统的响应速度,减小我们MySQL的压力。那么你有听说过向量数据库吗?知道向量数据库是用来做什么的吗?
熬夜磕代码
2023/11/25
9801
【腾讯云云上实验室】用向量数据库——实现高效文本检索功能
LangChain大模型应用开发
LangChain作为一个新兴的框架,旨在简化大模型应用的开发过程。它提供了一套工具和接口,帮助开发者将大模型无缝集成到各种应用场景中。通过LangChain,开发者可以更专注于业务逻辑的实现,而不必过多关注底层模型的复杂性。
@小森
2024/12/04
2031
LangChain大模型应用开发
【LangChain系列3】【检索模块详解】
总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)
Alice师傅的好宝宝
2025/01/07
2390
【玩转 GPU】搭建本地知识库--chatGLM+langchain(尝鲜篇)
有一天发现,在腾讯文档中想搜索之前写的东西需要收费了。这钱非花不可吗?好像不用。我们可以利用langchain+chatGLM在本地搭建自己的知识库,除了能搜索到文档这个功能,还能基于知识库内容和你进行对话问答~
languageX
2023/07/03
10.8K0
RAG流程优化(微调)的4个基本策略
在本文中,我们将介绍使用私有数据优化检索增强生成(RAG)的四种策略,可以提升生成任务的质量和准确性。通过使用一些优化策略,可以有效提升检索增强生成系统的性能和输出质量,使其在实际应用中能够更好地满足需求。
deephub
2024/07/01
1.3K0
RAG流程优化(微调)的4个基本策略
推荐阅读
相关推荐
商业实战将归巢网内容构建为本地RAG模型的完整指南01-优雅草卓伊凡
更多 >
LV.3
公众号bugstack虫洞栈
目录
  • 引子
  • Chroma快速上手
    • 设计理念
    • 完整Demo
    • 数据持久化
    • 数据集(Collection)
    • 文档(Document)
    • 简单查询
    • 条件查询
    • 更新文档
    • 删除文档
  • Chroma Embeddings算法
    • 默认Embeddings算法
    • 官方预训练模型
    • 其他第三方Embeddings算法
    • 自定义Embeddings算法
  • 实战:在Langchain中使用Chroma对中国古典四大名著进行相似性查询
    • 准备原始文档
    • 分隔文档
    • embedding
    • query
  • 总结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档