赞
踩
LangChain No.4
使用向量数据库的一个关键步骤是创建文本向量,并存储进数据库。这个工作通常是通过Embedding实现的。所以,使用向量数据库前,首先需要熟悉文本嵌入模型text embedding model
提供文本嵌入模型的有很多种,如:OpenAI
,Cohere
, Hugging Face
等,LangChain
定义了一个抽象的Embddings
类,用来与这些文本嵌入模型交互。Embeddings
的本质是对文本数据创建一个向量表示,这种对文本的数字表示,意味着我们就可以在一个向量空间中来考虑文本,如进行语义检索等需要查找文本片段的操作,使用embeddings
就非常类似于在向量空间中进行检索,对于查找相似文档等非常有用。
Embeddings
是LangChain
定义的进行文本嵌入模型的基本类,它暴露了两个方法:embedQuery
和embedDoucments
,前者用于创建基于文本参数的嵌入,接收单个文本作为输入参数;后者是用于文档的嵌入,接收多个文本作为输入参数。之将它们作为两个单独的方法,是因为一些嵌入模型程序对于文档和查询使用了不同的方法。
下面的示例演示了如何使用OpenAI
的嵌入模型。首先需要从langchain/embeddings/openai
中引入OpenAIEmbeddings
类:
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
其次,使用OpenAIEmbeddings
类来创建一个嵌入模型的实例,下面是使用embedQuery
方法,创建一个简单文本Hello world的嵌入。可见,它的结果是一个数字的向量。
/* Create instance */ const embeddings = new OpenAIEmbeddings(); /* Embed queries */ const res = await embeddings.embedQuery("Hello world"); /* [ -0.004845875, 0.004899438, -0.016358767, -0.024475135, -0.017341806, 0.012571548, -0.019156644, 0.009036391, -0.010227379, -0.026945334, 0.022861943, 0.010321903, -0.023479493, -0.0066544134, 0.007977734, 0.0026371893, 0.025206111, -0.012048521, 0.012943339, 0.013094575, -0.010580265, -0.003509951, 0.004070787, 0.008639394, -0.020631202, -0.0019203906, 0.012161949, -0.019194454, 0.030373365, -0.031028723, 0.0036170771, -0.007813894, -0.0060778237, -0.017820721, 0.0048647798, -0.015640393, 0.001373733, -0.015552171, 0.019534737, -0.016169721, 0.007316074, 0.008273906, 0.011418369, -0.01390117, -0.033347685, 0.011248227, 0.0042503807, -0.012792102, -0.0014595914, 0.028356876, 0.025407761, 0.00076445413, -0.016308354, 0.017455231, -0.016396577, 0.008557475, -0.03312083, 0.031104341, 0.032389853, -0.02132437, 0.003324056, 0.0055610985, -0.0078012915, 0.006090427, 0.0062038545, 0.0169133, 0.0036391325, 0.0076815626, -0.018841568, 0.026037913, 0.024550753, 0.0055264398, -0.0015824712, -0.0047765584, 0.018425668, 0.0030656934, -0.0113742575, -0.0020322427, 0.005069579, 0.0022701253, 0.036095154, -0.027449455, -0.008475555, 0.015388331, 0.018917186, 0.0018999106, -0.003349262, 0.020895867, -0.014480911, -0.025042271, 0.012546342, 0.013850759, 0.0069253794, 0.008588983, -0.015199285, -0.0029585673, -0.008759124, 0.016749462, 0.004111747, -0.04804285, ... 1436 more items ] */
你也可以尝试embedDoucments
方法的使用,并查看文档嵌入的结果。下列代码演示了通过[“Hello world”, “Bye bye”]方法,生成一个简单文档嵌入的方法。你还可以通过使用文档的加载器,来加载一个完整的文档,查看不同文档转换的结果。
/* Embed documents */
const documentRes = await embeddings.embedDocuments(["Hello world", "Bye bye"]);
总之,文本嵌入模型主要是生成一个对文本的向量表示,以此来更方便的实现文档的检索等功能。
此处演示MemoryVectorStore
的使用,它是将创建的文本嵌入存储在内存中,并且对相似的嵌入进行精确的线性搜索。
首先需要引入矢量数据库和OpenAIEmbeddings类
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
然后通过.fromTexts
方法,创建一个矢量数据库的实例,然后进行相似搜索,使用.similaritySearch
方法。
const vectorStore = await MemoryVectorStore.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings()
);
const resultOne = await vectorStore.similaritySearch("hello world", 1);
console.log(resultOne);
结果如下:
/*
[
Document {
pageContent: "Hello world",
metadata: { id: 2 }
}
]
*/
除引入矢量数据库和OpenAIEmbeddings类之外,创建要给基于文件的索引还需要引入文件加载器TextLoader
。首先引入需要的类
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { TextLoader } from "langchain/document_loaders/fs/text";
其次,通过文件加载器获取到文件的内容,使用fromDocuments
方法将文档内容加载到矢量数据库,最后,通过similaritySearch
方法进行检索。
// Create docs with a loader const loader = new TextLoader("src/document_loaders/example_data/example.txt"); const docs = await loader.load(); // Load the docs into the vector store const vectorStore = await MemoryVectorStore.fromDocuments( docs, new OpenAIEmbeddings() ); // Search for the most similar document const resultOne = await vectorStore.similaritySearch("hello world", 1); console.log(resultOne); /* [ Document { pageContent: "Hello world", metadata: { id: 2 } } ] */
你可以使用一个文档或使用一段文本和它们的相关元数据来创建一个矢量数据库,或者使用已经存在的索引来创建一个矢量数据库。LangChain
中定义创建矢量数据库的方法有两个:fromTexts
和fromDocuments
,它们所接收的参数分别有(来自langchain源码):
abstract class BaseVectorStore implements VectorStore {
static fromTexts(
texts: string[],
metadatas: object[] | object,
embeddings: Embeddings,
dbConfig: Record<string, any>
): Promise<VectorStore>;
static fromDocuments(
docs: Document[],
embeddings: Embeddings,
dbConfig: Record<string, any>
): Promise<VectorStore>;
}
上述实例中使用到了VectorStore
接口所提供的similaritySearch
方法,VectorStore
类还提供了其它的方法供使用(来自langchain源码):
interface VectorStore { /** * Add more documents to an existing VectorStore. 向已存在的矢量数据库中添加文档 * Some providers support additional parameters, e.g. to associate custom ids * with added documents or to change the batch size of bulk inserts. 一些供应商还支持其它附加的参数,如将自定义 ID 与已添加的文档相关联或更改批量插入的批量大小 * Returns an array of ids for the documents or nothing. 返回文档的id数组或无返回值 */ addDocuments( documents: Document[], options?: Record<string, any> ): Promise<string[] | void>; /** * Search for the most similar documents to a query 搜索与查询条件最相似的文档 */ similaritySearch( query: string, k?: number, filter?: object | undefined ): Promise<Document[]>; /** * Search for the most similar documents to a query, 搜索与查询最相似的文档 * and return their similarity score 返回相似的范围 */ similaritySearchWithScore( query: string, k = 4, filter: object | undefined = undefined ): Promise<[object, number][]>; /** * Turn a VectorStore into a Retriever 向量数据库转Retriever */ asRetriever(k?: number): BaseRetriever; /** * Delete embedded documents from the vector store matching the passed in parameter. 从向量数据库中删除与传入参数匹配的嵌入文档 * Not supported by every provider. */ delete(params?: Record<string, any>): Promise<void>; /** * Advanced: Add more documents to an existing VectorStore, 向已经存在的向量数据库中添加文档 * when you already have their embeddings */ addVectors( vectors: number[][], documents: Document[], options?: Record<string, any> ): Promise<string[] | void>; /** * Advanced: Search for the most similar documents to a query, 搜索与查询相似的文档 * when you already have the embedding of the query */ similaritySearchVectorWithScore( query: number[], k: number, filter?: object ): Promise<[Document, number][]>; }
向量数据库有很多个,可点击 这里 进行查看。常见的如Memory
, Elasticsearch
, Redis
, Chroma
等。
下面是一个根据不同使用场景的快速向导,它可以帮助你选择正确的向量数据库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。