Langchain 和 Chroma 的集成

news2024/11/29 3:48:49

Langchain 和 Chroma 的集成

  • 1. Chroma
  • 2. 基本示例​
  • 3. 基本示例(包括保存到磁盘)
  • 4. 将 Chroma Client 传递到 Langchain ​
  • 5. 基本示例(使用 Docker 容器)
  • 6. 更新和删除
  • 7. 带分数的相似性搜索​

1. Chroma

Chroma 是一个人工智能原生开源矢量数据库,专注于开发人员的生产力和幸福感。 Chroma 在 Apache 2.0 下获得许可。

安装 Chroma:

pip install chromadb

Chroma 以多种模式运行。请参阅下面每个与 LangChain 集成的示例。

  • in-memory - 在 python 脚本或 jupyter 笔记本中
  • in-memory with persistance - 在脚本或笔记本中并保存/加载到磁盘
  • in a docker container - 作为运行本地计算机或在云中的服务器

与任何其他数据库一样,您可以:

  • .add
  • .get
  • .update
  • .upsert
  • .delete
  • .peek
  • .query 运行相似性搜索。

在 docs 中查看完整文档。要直接访问这些方法,您可以执行 ._collection_.method()

2. 基本示例​

在这个基本示例中,我们获取最新的国情咨文地址,将其分成块,使用开源嵌入模型将其嵌入,将其加载到 Chroma,然后查询它。

先创建要给测试文档,命名为 sidamingzhu.txt,里面包括了“三打白骨精”、“桃园结义”、"武松打虎"的故事。


《西游记》中“三打白骨精”的故事原文:

话说唐僧师徒四人西天取经,途经白虎岭。

白虎岭上有个妖怪,名叫白骨精。

白骨精是一个老妖怪,她已经死了几百年,只剩下一堆白骨。

她为了吃唐僧肉,就变幻成一个美丽的女子,来引诱唐僧。

孙悟空知道白骨精是妖怪,就去阻止她。

白骨精见孙悟空来,就变幻成一个村姑,说自己是来卖枣的。

孙悟空不相信,就用金箍棒打死了她。

白骨精死了,但她并没有死透。

她又变幻成一个老妇人,来找唐僧。

孙悟空又去阻止她,又用金箍棒打死了她。

白骨精死了两次,但她还是没有死透。

她又变幻成一个老公公,来找唐僧。

孙悟空又去阻止她,又用金箍棒打死了她。

唐僧见孙悟空三次打死人,就很生气。

他把孙悟空赶回了花果山。

孙悟空知道唐僧被妖怪迷惑,就再次赶来救唐僧。

他找到了白骨精,用金箍棒打死了她。

唐僧这才知道孙悟空是好心,就把孙悟空接回了队伍。

《三国演义》中“桃园三结义”的故事原文:

话说宴罢,天色已晚,众人散去。

刘备留下关张二人,以兄事之。

过了几日,谋曰:“吾与二君,虽异姓,然宗室也。

今天下大乱,正要人才。

若能俱发义心,救动仓皇;联合英雄,扶大道。

此吾三人之有也。

”张飞曰:“若要发大义,当如之何?”

刘备曰:“今日天色晚了,明日清早,我们同去桃园,契约志同。”

次日,三人同至桃园,刘备事先示意关张二人,各持一枝桃花,致告天地曰:

“吾等三人,虽异姓,宗室也;今天下大乱,列国混战,正当汉室衰微之秋。

此时天下豪杰,并起义兵,各据州郡。唯有美意,救汉室于危亡。

吾等三人,不求得州牧,不求得侯王,愿出心肝荐轸,誓将清君侧,兴复汉室!此心此义,使天日月为证,使星辰为鉴,无贰其志,殊死随之。

如背盟约,无妾百福!”

三人各自对天地、日月星辰发誓,然后两两互持桃枝彼此磕头,作兄弟之礼,场面极为隆重感人。

自此,刘关张三人正式结拜为交心之兄弟。

《水浒传》中“武松打虎”的故事原文:

武大郎忍痛抽筋,往后瞧时,只见那猛虎抡起铁棒,向自己直扑将来。

武大郎使开双戟,侧身让过。那猛虎扑了一空,回头又扑。

武大郎举戟架住,口中大呼:“我奉王命,捉你回去论罪!”

那猛虎被他这一架,戟钢扎疼了手,发起狠来,向武大郎直扑。

武大郎使开戟去迎战。二人战了十余合,打得难解难分。

这虎本是山中猛虫,十分凶悍。

这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。

这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。

打到第三十合,那猛虎扑空,回头待扑,武大郎举刀往下一砍,砍断它的两只前腿。

那猛虎痛得嗷嗷乱叫,后腿着地,要向武大郎扑将来。

武大郎顺手又一刀,把它一只后腿也砍断。

示例代码,

# import
from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
# load the document and split it into chunks
loader = TextLoader(".\sidamingzhu.txt", encoding="utf-8")
documents = loader.load()
# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# create the open-source embedding function
embedding_function = SentenceTransformerEmbeddings(model_name="shibing624/text2vec-base-chinese")
# embedding_function = SentenceTransformerEmbeddings(model_name="GanymedeNil/text2vec-large-chinese")
# embedding_function = SentenceTransformerEmbeddings(model_name="moka-ai/m3e-large")

# load it into Chroma
db = Chroma.from_documents(docs, embedding_function)

# query it
query = "白骨精被打死几次?"
docs = db.similarity_search(query, k=3) # default k is 4

print(len(docs))

# print results
for doc in docs:
    print("="*100)
    print(doc.page_content)

输出结果,

在这里插入图片描述
示例代码,

# query it
query = "刘关张在桃园做什么?"
docs = db.similarity_search(query, k=3) # default k is 4

print(len(docs))

# print results
for doc in docs:
    print("="*100)
    print(doc.page_content)

输出结果,
在这里插入图片描述
示例代码,

# query it
query = "武大郎打的什么?"
docs = db.similarity_search(query, k=3) # default k is 4

print(len(docs))

# print results
for doc in docs:
    print("="*100)
    print(doc.page_content)

输出结果,

在这里插入图片描述

3. 基本示例(包括保存到磁盘)

扩展前面的示例,如果您想保存到磁盘,只需初始化 Chroma 客户端并传递您想要保存数据的目录即可。

Caution :Chroma 尽力自动将数据保存到磁盘,但是多个内存客户端可能会干扰彼此的工作。作为最佳实践,在任何给定时间,每个路径仅运行一个客户端。

示例代码,

# save to disk
db2 = Chroma.from_documents(docs, embedding_function, persist_directory="./chroma_db")
docs = db2.similarity_search(query, k=1) # default k is 4

print(docs[0].page_content)

输出结果,

在这里插入图片描述

示例代码,

# load from disk
db3 = Chroma(persist_directory="./chroma_db", embedding_function=embedding_function)
docs = db3.similarity_search(query, k=1) # default k is 4

print(docs[0].page_content)

输出结果,

在这里插入图片描述

4. 将 Chroma Client 传递到 Langchain ​

您还可以创建一个Chroma Client并将其传递给LangChain。如果您希望更轻松地访问底层数据库,这尤其有用。

您还可以指定您希望 LangChain 使用的集合名称。

示例代码,

import chromadb

persistent_client = chromadb.PersistentClient()
collection = persistent_client.get_or_create_collection("collection_name")
collection.add(ids=["1", "2", "3"], documents=["a", "b", "c"])

langchain_chroma = Chroma(
    client=persistent_client,
    collection_name="collection_name",
    embedding_function=embedding_function,
)

print("There are", langchain_chroma._collection.count(), "in the collection")

输出结果,

Add of existing embedding ID: 1
Add of existing embedding ID: 2
Add of existing embedding ID: 3
Add of existing embedding ID: 1
Add of existing embedding ID: 2
Add of existing embedding ID: 3
Insert of existing embedding ID: 1
Add of existing embedding ID: 1
Insert of existing embedding ID: 2
Add of existing embedding ID: 2
Insert of existing embedding ID: 3
Add of existing embedding ID: 3
There are 3 in the collection

5. 基本示例(使用 Docker 容器)

6. 更新和删除

在构建实际应用程序时,您不仅需要添加数据,还需要更新和删除数据。

Chroma 让用户提供 ids 来简化此处的记账。 ids 可以是文件名,也可以是 filename_paragraphNumber 等组合。

Chroma 支持所有这些操作 - 尽管其中一些操作通过 LangChain 界面集成仍在进行中。很快就会添加其他工作流程改进。

这是一个基本示例,展示了如何执行各种操作:

# create simple ids
ids = [str(i) for i in range(1, len(docs) + 1)]

# add data
example_db = Chroma.from_documents(docs, embedding_function, ids=ids)
# print(example_db)
docs = example_db.similarity_search(query)
print(docs[0].metadata)

输出结果,

{'source': '.\\sidamingzhu.txt'}

示例代码,

# update the metadata for a document
docs[0].metadata = {
    "source": "./sidamingzhu.txt",
    "new_value": "你好,世界!",
}
example_db.update_document(ids[0], docs[0])
print(example_db._collection.get(ids=[ids[0]]))

输出结果,

{'ids': ['1'], 'embeddings': None, 'metadatas': [{'new_value': '你好,世界!', 'source': './sidamingzhu.txt'}], 'documents': ['这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。']}

示例代码,

# delete the last document
print("count before", example_db._collection.count())
example_db._collection.delete(ids=[ids[-1]])
print("count after", example_db._collection.count())

输出结果,

count before 17
count after 16

7. 带分数的相似性搜索​

返回的距离分数是余弦距离。因此,分数越低越好。

示例代码,

docs = db.similarity_search_with_score(query)
docs[0]

输出结果,

(Document(page_content='这一场恶战,战不到五十合,武大郎手软筋麻,使不动戟,只得拔了武松的宝贝青龙偃月刀,向前迎敌。\n\n这一场好杀:武大郎左闪右避,虎扑不着;虎右藏左藏,武大郎砍不着。', metadata={'source': '.\\sidamingzhu.txt'}),
 240.21286010742188)

refer: https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma

完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity游戏源码分享-三国群英传

Unity游戏源码分享-三国群英传 完整版 工程地址:https://download.csdn.net/download/Highning0007/88069201

vue-element-template管理模板(二)

vue-element-admin框架 动态路由(二) 修改代码: import { asyncRoutes, constantRoutes } from "/router"; import { getMenu } from "/api/user"; import Layout from "/layout";/*** Use meta.role to det…

PCB 封装焊盘盖油了,什么原因?

PCB 封装焊盘盖油了,什么原因? 背景:当PCB切换到3D视图检查错误时,突然发现某个别芯片的封装管脚竟然是处于盖油状态,这肯定是个bug。制板厂家EQ,在审核生成稿时,也回打来电话确认“焊盘是否需…

python数据分析05—Pandas数据处理

目录 1.缺失数据处理 1.1 DataFrame自身产生的缺失数据 1.2 缺失数据判断和统计 ​1.3 缺失数据清理 2. 多源数据操作 2.1 合并函数:merge() 2.2 连接函数:join() 2.3 指定方向合并:concat() 3. 数据分组和聚合运算 3.1 groupby()方…

使用Nacos将单体服务注册成微服务的步骤以及相关问题解决

目录 1.改造单体服务的配置文件。 2.添加Nacosw相关的pom依赖 3.在nacos的配置列表中创建配置列表 4.相关问题的解决 1.改造单体服务的配置文件。 🔖创建一个bootstrap.yml的配置文件该文件通常放置在src/main/resources目录中,并且优先于applicati…

C语言学习笔记 码云及git使用教程-05

目录 一、码云简介 二、码云注册 1.点击右上角的注册按钮 2.填写相应的注册信息 3.使用账号密码进行登陆 三、创建仓库 1.如图新建 2.定义仓库相应参数 3.初始化readme文件 4.效果 5.开源设置 四、git管理 1.安装git 2.打开桌面上的Git bash 3.进行仓库克隆 4. 在其他盘…

信息与通信工程面试准备——专业知识提问

1.无线通信:依靠电磁波在空间传播以传输信息。 2.通信的目的:传输信息。 3.通信系统:将信息从信源发送到一个或多个目的地。 4.本书中通信一般指电信:利用电信号传输信息(光通信属于电信,因为光也是一种…

Java中的队列

队列的理解 队列(Queue)是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。 LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。 常用方法 实例 import java.util…

zabbix监控-钉钉webhook告警并使用markdown格式

zabbix监控-企业微信webhook告警并使用markdown格式 最终告警样式: markdown格式与text格式的优点:文字排版清晰,可对不同文字标识颜色,大小等。 此方法使用zabbix提供的webhook方式,不需要建立脚本文件。 zabbix版…

【人工智能】监督学习、分类问题、决策树、信息增益

文章目录 Decision Trees 决策树建立决策树分类模型的流程如何建立决策树?决策树学习表达能力决策树学习信息论在决策树学习中的应用特征选择准则一:信息增益举例结论不足回到餐厅的例子从12个例子中学到的决策树:Decision Trees 决策树 什么是决策树 —— 基本概念 非叶节…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 20 日论文合集)

文章目录 一、检测相关(7篇)1.1 Drone navigation and license place detection for vehicle location in indoor spaces1.2 BSDM: Background Suppression Diffusion Model for Hyperspectral Anomaly Detection1.3 Domain Adaptation for Enhanced Object Detection in Foggy…

STM32C0开发(2)----开发板介绍

基于RASC的keil电子时钟制作_配置keil以及使用串口进行打印 套件概述样品申请特征系统控制和生态系统访问功能示意图系统框图跳线设置开发板原理图 套件概述 STM32C011F4P6-TSSOP20评估套件可以使用户能够无缝评估TSSOP20封装中STM32C0S系列微控制器的功能,具备高效…

Java面试题总结记录(2)—— 多线程并发篇

1、Java实现多线程的方法 创建线程的常用方式 继承Thread类实现Runnable接口实现Callable接口线程池方式创建 说明: 通过继承 Thread 或 实现 Runnable接口,Callable接口都可以实现多线程,不过实现Runnable接口与实现Callable接口的方式基本…

gin 中间件流程控制:Next()、 Abort()

gin 中间件流程控制 Next() 源码注释:Next应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。 通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它之后的函数,最后再来执行完本函…

Python Flask构建微信小程序订餐系统 (十)

🔥 编辑会员信息 🔥 编辑会员信息可以通过点击会员列表操作,也可以点击会员信息详情点击进行操作 🔥 修改编程会员信息列表布局 🔥 修改 web/templates/member/index.html 文件,添加跳转到编辑会员信息的页面 web/templates/member/set.html 🔥 创建用于会员…

Dockerfile文件+docker build命令方式创建Docker自定义镜像

自定义镜像 mycentosjava8 自定义一个centos镜像,具备vimifconfigjdk8的配置 拉取centos镜像 docker pull centos 该默认镜像此时还没有vim、ifconfig和jdk的配置或功能 jdk8的下载 地址:https://www.oracle.com/java/technologies/downloads/#java8 …

关于Nginx的 location 配置各种情况转换后的样子记录

Nginx location 配置要代理的地址测试URL代理后的URL举例编号/test01http://127.0.0.1:8080/test01/abc/test/test01/abc/test01/test02http://127.0.0.1:8080//test02/abc/test//abc/test02/test03/http://127.0.0.1:8080/test03/abc/test/test03/abc/test03/test04/http://12…

MYSQL练习一

练习一 创建stroe数据库,在数据库中根据开发喵store业务 创建表,表结构如下,并插入以下数据,完成下面的 sql 表数据: - 查询商品库存等于50的所有商品,显示商品编号,商 品名称,商品…

Vue第四篇:html和js基础知识查漏补缺

1、a标签 定义超链接,用于从一个页面链接到另一个页面 target属性:打开目标URL的方式,_top为再当前窗口打开,_blank为新窗口打开 2、span标签 对文档中的行内元素进行组合,它提供了一种将文本的一部分或者文档的一部分…

GB2312编码

说明 GB2312代码表用两个字节表示一个图形字符,两个字节中前面的字节为第一字节,后面的字节为第二字节。 区位码: GB2312代码表分成94个区,范围为1-94,区的编号由第一字节表示;每个区有94位,范…