mongodb 使用Langchain创建嵌入后保存向量

zlwx9yxi  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(296)

我正在使用Langchain和OpenAI从一些PDF文档中创建嵌入,以询问这些PDF文档的问题。我正在使用NodeJS并尝试在Mongo Atlas中保存向量。
在服务启动时,我在MongoDBAtlasVectorSearch类上调用fromDocuments()方法。该方法采用嵌入模型,我将其传入OpenAIEmbeddings的示例,该示例正在调用OpenAI Embeddings API。我遇到的问题是,每次服务启动时都会发生这种情况,并且我使用OpenAI运行成本非常快。
我在文档中看到,fromDocuments()将文档添加到底层Mongo集合中,但文档中没有任何地方指示稍后在何处使用底层集合来重新加载先前保存的向量。
这是我用来添加文档的代码:

this.vectorStore = await MongoDBAtlasVectorSearch.fromDocuments(docs, embeddings, {
      collection: this.collection
    });

字符串
参数this.collection是我通过NodeJS的MongoDB客户端获得的底层集合(我在此代码之前通过名称检索集合)。embeddings参数是OpenAIEmbeddings的示例。
我们是否可以保存以前创建的向量并重新加载它们,以避免在初始加载后再次重新创建嵌入?

doinxwow

doinxwow2#

我终于能够使用这个文档来实现它:https://js.langchain.com/docs/modules/data_connection/vectorstores/integrations/mongodb_atlas
就这么简单:使用Mongo驱动程序从Mongo加载底层集合,而不是在MongoDBAtlasVectorSearch上调用fromDocuments(),我所要做的就是构造对象并传递该集合,就像这样:

const embeddings = new OpenAIEmbeddings();
this.vectorStore = new MongoDBAtlasVectorSearch(embeddings, { collection: this.collection });

字符串
即使我传入一个embeddings对象,如果集合中有文档,它也不会使用它。
如果底层集合为空,则需要首先填充集合。您可以通过调用fromDocuments()来执行此操作,它会自动创建嵌入并将向量添加到集合中:

const embeddings = new OpenAIEmbeddings();
this.vectorStore = await MongoDBAtlasVectorSearch.fromDocuments(docs, embeddings, {
      collection: this.collection
    });


希望这对某人有帮助,因为它对我来说是一个救星!

相关问题