使用 embedding 技术,也就是嵌入技术,我们可以把文本转换成向量,这样就可以更好的找出相关联的内容了。存储内容的 embedding,也就是向量,我们会用到一种特别的数据库,也就是 vector store 或者叫 vector database。
这种向量数据库有很多品牌可以选择,比如 Chroma,Milvus,Pinecone,Supabase 或者 Weaviate 等等。在 LangChain 应用里可以很方便地集成使用这些向量数据库。
HNSWLib
HNSWLib 是一个在内存中的向量存储库,不需要额外运行一个数据库系统,在终端,项目所在目录的下面,执行 npm install 安装一下 hnswlib-node。
在这个 Node.js 程序文件的顶部,导入 HNSWLib ,它来自 langchain/vectorstores/hnswlib。再导入一个 embeddings,导入 OpenAIEmbeddings ,它来自 langchain/embeddings/openai。
然后可以准备一组文本,声明一个 texts ,它是一个数组,里面的项目是一些内容的标题。'使用 Nest.js 和 TypeScript 构建一个简单的微服务应用','如何在 Vue.js 中使用 Vuetify 实现 Material Design 风格','掌握 Pandas 中的分组和聚合操作' 。
再声明一个 metadata,它也是一个数组,里面的项目是一个对象,这个对象就是用来描述对应的文本相关的一些数据。比如我们可以在项目里添加一个 id 属性,具体需要哪些属性可以根据自己的需求来决定。
声明一个 embeddings,它的值可以新建一个 OpenAIEmbeddings ,用它可以给文本创建嵌入。
然后声明一个 vectorStore,等于 await,用一下 HNSWLib.fromTexts ,在 LangChain 集成的向量存储上面都会有一个这样的方法,它可以根据一组文本创建一个向量存储。给它提供一组 texts,还有文本相关的 metadata,然后还需要一个生成嵌入需要的 embeddings。
下面可以测试一下,声明一个 result,等于 await,用一下 vectorStore 上的 similaritySearch 这个方法,表示相似度搜索,第一个参数是要搜索的东西,比如 “Node.js”, 再把 k 这个参数的值设置成 1 。然后在控制台上输出这个搜索结果,也就是 result。
在终端,项目所在目录的下面,执行 node index.mjs。这里输出的是一组 Document,这个文档就是根据我们提供的文本创建的,你会发现这个文档的内容是 “使用 Nest.js 和 TypeScript 构建一个简单的微服务应用” ,虽然这个标题内容里并不包含我们要找的 Node.js 这个关键词,但是 Nest.js 是一个 Node.js 应用框架,在所有标题内容里,这个标题内容跟 Node.js 的相似度最高。
再试一下,搜索一下 “数据科学”,在终端,再运行一下应用,这回返回的这个 Document 的内容是 “掌握 Pandas 中的分组和聚合操作”,因为 Pandas 这个库经常会用在数据科学领域。