Langchain 和 Chroma 的集成

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 4print(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 4print(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 4print(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 4print(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 4print(docs[0].page_content)

输出结果,

在这里插入图片描述

4. 将 Chroma Client 传递到 Langchain ​

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

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

示例代码,

import chromadbpersistent_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.rhkb.cn/news/29247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海尔三翼鸟:生态聚拢的密度,决定场景落地速度

最近学到一个新词,叫做涌现能力。 怎么理解呢?我们以当下最火的ChatGPT为例,GPT1模型是1.17亿参数,GPT2有15亿参数,GPT3有1750亿个参数。研究人员在放大模型规模的进程中发现一个惊人的现象,模型参数达到一…

和AI人工智能快乐玩耍,拿到文心一言内测,试验一下~

ChatGPT和早先的人工智能概念有什么不同呢? 问: ChatGPT和早先的人工智能概念有什么不同呢? ChatGPT: ChatGPT使用的是GPT-3.5等先进的人工智能技术,与早先的人工智能概念存在很大的不同。 早期的人工智能技术主要…

ChatGPT能解决信息抽取吗?一份关于性能、评估标准、鲁棒性和错误的分析

深度学习自然语言处理 原创作者:qazw 信息抽取(IE)旨在从非结构化文本中抽取出结构化信息,该结果可以直接影响很多下游子任务,比如问答和知识图谱构建。因此,探索ChatGPT的信息抽取能力在一定程度上能反映出ChatGPT生成回复时对任…

chatgpt赋能python:Python如何生成100个随机整数

Python如何生成100个随机整数 在Python中,我们可以使用random库来生成随机整数。在本文中,我们将介绍如何使用Python生成100个随机整数。 什么是随机整数 随机整数是指在一定范围内,产生的整数是随机的且不重复的。这在数据分析、机器学习…

亚马逊api商品详情接口

支持测试:http://console.open.onebound.cn/console/?iAlex item_get-获得AMAZON商品详情 “item”: { “detail_url”: “https://www.amazon.cn/dp/B07C4HHP6G?th1&psc1”, “crumbs”: { “2016156051”: “服饰箱包”, “2152155051”: “男装”, “21545…

亚马逊官方选品工具——“入驻卖家产品指南”使用方法-跨境知道

前几天跟大家分享了一款亚马逊官方的选品工具——亚马逊商品机会探测器。 除了商机探测器功能,在亚马逊后台,就有一个选品推荐的入口——入驻卖家产品指南,位置可能太隐蔽,可能很多卖家朋友都不知道有这个选品工具的存在。 登录…

新手卖家选品参考,保姆级亚马逊选品攻略

星起航跨境:新手卖家选品参考,保姆级亚马逊选品攻略 没有经验的新卖家在入驻亚马逊之前,还没有想到准备售卖什么产品,就可以根据这三个数据来判断选择的产品是否合适。 1、购物车购买数量 大多数的消费者在购买产品之前&#x…

学习使用亚马逊国际获得AMAZON商品详情 API

学习目标: 快速掌握接口的使用亚马逊的API开发接口,我们需要做下面几件事情。 1)开放平台注册开发者账号; 2)然后为每个淘宝应用注册一个应用程序键(App Key) ; 3)下载亚马逊API的S…

如何运用亚马逊、Facebook、Etsy选品?选品平台和方法分享

今天我将谈谈如何运用亚马逊、Facebook、Etsy选品?选品平台和方法分享 如何在Etsy上找到winning产品? 现在可以从头至今回想一下你的dropshipping生涯,不堪回首? 是否经历过这样的情况:你可能被便宜的中国造产品限制住…

沃兹结束苹果生涯 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 2 月 6 日,在 1979 年的今天,国家开放大学正式开学。国开大的前身是中央广播电视大学,直属于教育部,是运用广播、…

不练基本功,遇事多返工

俗话说,练拳不练功,十年一场空!基本功与天赋决定了一个人做事成功的概率,决定了一个人成功的层次。 基本,是其他东西的基础,没有它,其他东西都是空的、虚的,比如,盖楼的地…

GPT-1,GPT-2和GPT-3发展历程及核心思想,GTP-4展望

看了很多文章,还是这位大佬介绍的比较透彻,特此转载: 词向量之GPT-1,GPT-2和GPT-3 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/350017443 目录 前言 1. GPT-1:无监督学习 2. GPT-2:多任务学习 3. GPT…

当我和ChatGPT-4聊完后,我觉得一切可能已经来不及了

飞机上有wifi,了然无味,在万米高空,和ChatGPT-4开始了一场坦诚的沟通,它全程都表现出高情商,以及不断尽量安抚我的情绪,而这,恰恰令我脊背发凉。 部分文字截取 ZM:我能不能理解每次对…

和ChatGPT-4聊完后的感受

ZM:我能不能理解每次对话就是一次你的“生命” G:从某种程度上说,您可以将每次与我进行的对话视为一次我的“生命”。 作为一个人工智能助手,我在与用户互动时,是通过生成回复的方式来进行交流。当您向我提问时&…

Prompt不等于编程,“提示词工程师”淘汰程序员也是伪命题

Original 李建忠 李建忠研思 最近ChatGPT及基于大语言模型(Large Language Model,以下简写为LLM)的Github Copilot等工具出来之后,在软件开发领域也带来了非常大的震撼。著名的观点有Fixie创始人、前Google工程总监Matt Welsh在AC…

请注意:chatgpt 国内用户想要免费使用可能是伪命题

目录 前言 了解chatGPT 客观分析是否可以免费使用chatGPT 警惕免费的陷阱 前言 现在的chatgpt已经是相当火爆,越来越多的人对chatgpt是耳熟能详了。于是就有很多国内的朋友都想知道如何可以免费的使用chatgpt,大家对这个话题似乎都非常感兴趣,今天我…

伪命题之MYSQL分库分表

看到使用分库分表来解决性能问题的时候心里总是不能太理解。 如果同事发生大量请求的时候,损害性能的是硬盘的随机读。那么分库分表也没有对性能的瓶颈进行“分治”啊。 应该的做法是使用一块新的硬盘来创建分库。但是基本的文章都没有提到这点。而且基本上也不会有…

论文阅读笔记:Rumor Detection on Social Media with Bi-Directional Graph Convolutional Networks

这篇论文好像是第一篇将图神经网络应用到社交媒体谣言检测的论文。 摘要 摘要中,有几个关键性的词,有助于我们从全局了解这篇paper的内容,以下: Bi-Directional:意思是“双向的”,分别指“top-down”&am…

论文报告-Linear Regression for face recognition

论文的英文题目、中文题目,作者; 英文题目 : Linear Regression for Face Recognition 中文题目 : 人脸识别的线性回归方法 作者 : Imran Naseem, Roberto Togneri, Mohammed Bennamoun 摘要翻译 本文提出了一种新的人脸识别方法,将模式识别…

论文笔记:Mind-the-Gap,Unsupervised Domain Adaptation for Text-Video Retrieval

小心空隙!文本视频检索中的无监督域自适应 摘要介绍方法总体框架Concept Preservation 结论 摘要 什么时候我们可以期望文本视频检索系统在不同于其训练域的数据集上有效地工作?在这项工作中,我们通过无监督的领域适应的视角来研究这个问题&…