我正在使用Python使用Langchain和ChromaDb。
现在,我知道如何使用文档加载器。例如,下面的代码将一堆文档加载到ChromaDb中:
from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings, persist_directory='db')
db.persist()
但是如果我想一次添加一个文档呢?更具体地说,我想在添加文档之前检查它是否存在。这样我就不会一直添加重复项。
如果一个文档不存在,只有这样我才想获取嵌入并添加它。
我如何使用langchain实现这一点?我想我基本上理解了langchain,但不知道如何完成这样看似基本的任务。
2条答案
按热度按时间q8l4jmvw1#
我认为有更好的方法可以做到这一点,但这是我在阅读图书馆后发现的:
如果您看到
Chroma.from_documents()
方法,它接受ids
参数。使用此参数,您可以为文档设置预定义的
id
。如果你没有传递任何id,它将创建一些随机的id。参见langchain库中的以下参考:因此,这里的解决方案是,您必须在存储文档时为各个文档设置一些唯一的ID/密钥。在我的例子中,我为每个文档使用了一个唯一的URL,将其转换为散列,并在id参数上传递它们。之后,当您再次存储文档时,检查每个文档的存储,如果它们存在于DB中,并将它们从
docs
中删除(参考示例代码),最后调用Chroma.from_documents()
,并从列表中删除重复的文档。请参考下面的示例代码。0qx6xfy62#
仅根据文档内容过滤
这里有一个替代的过滤机制,它使用了一个很好的列表解析技巧,利用了与Python中
or
运算符相关的truthy求值:在第一行中,使用
uuid.uuid5()
函数为每个文档生成一个唯一的UUID,该函数使用名称空间标识符和名称字符串(在本例中为文档的内容)的SHA-1散列创建UUID。列表解析中的
if
条件检查当前文档的ID是否存在于seen_ids
集合中:seen_ids.add(id)
将其添加到seen_ids
,并将文档包含在unique_docs
中。最后的
or True
对于if
条件总是返回一个truthy值是必要的,因为seen_ids.add(id)
返回None
(这是falsy),即使一个元素被成功添加。这种方法比使用URL或其他文档元数据生成ID更实用,因为它直接防止基于内容而不是依赖于元数据或手动检查添加重复文档。