data-connection

data-connection

这块主要介绍大模型中如何使用数据,向量数据库大家都听说过。先把文本资料存储到向量数据库,然后查询搜索内容相关的向量数据知识作为上下文输入;

  • 这里主要介绍这些资料数据如何转换成向量存储,如何在获取出来;

许多 LLM 应用程序需要用户特定的数据,这些数据不属于模型的训练集。

LangChain 为您提供了加载、转换和查询数据的基础构件:

  • 文档加载器(Document loaders):从许多不同的源加载文档
  • 文档转换器(Document transformers):分割文档、删除冗余文档等
  • 文本嵌入模型(Text embedding models):将非结构化文本转换为浮点数列表
  • 向量存储(Vector stores):存储和检索嵌入数据
  • 检索器 (Retrievers):查询您的数据

文档加载器

这一步主要是读取数据源,一般是文本数据源;

langchain提供了多种常用的文档加载器,包括

  • JSONLoader
  • JSONLinesLoader
  • TextLoader
  • CSVLoader

文档转换器

这部分主要是解析读取的文本数据,主要是分词工作;学过NLP基本知识就知道,第一步处理文本就是分词;分词有不同的算法,要保证分词尽可能全,尽可能准确;

langchain提供的分析算法:

  • CharacterTextSplitter, 按照分隔符分割,超出快最大长度就分开;
    • 参数有分隔符,块最大长度,块重叠字符数
  • RecursiveCharacterTextSplitter,重叠滑动窗口分词
    • 参数有块最大长度,块重叠字符数,滑动窗口来分词;,分制词默认是[’\n\n’, ‘\n’, ’ ‘],尽可能保持所有段落(然后句子,然后单词)在一起,因为它们在语义上通常是最相关的文本片段
import { Document } from "langchain/document";
import { RecursiveCharacterTextSplitter } from "langchain/text _splitter";

const text = `Hi.I'n Harrison.How? Are? You?Okay then
This is a weird text to write, but gotta test the splittingged some how.
Bye!-H.*`;
const splitter = new RecursiveCharacterTextSplitter({
    chunkSize: 100,
    chunkOvErlap: 20,
};
const docOutput = await splitter.splitDocuments(||
    new Document({ pageContent: text }),
]);

-output-
Document 1
pageContent: "Hi.I'm Harrison.How? Are? You?Okay then f f f f.", metadata: { loc: [Object] }
Document 1
pageContent: `This is a weird text to write, but gotta test the splittinggag some how.\n
 + Bye!-H. `
netadata: { loc: [Object] }

文本嵌入

embeding的过程主要是将上步骤的分词转化为词向量数据,这里需要注意最好用和大模型一样的词向量库,这样后面再查询关联性的时候才能保证和大模型是一样的关联度;

  • 用大模型词向量库查询分词的向量表示,将向量存入到本地向量库中;
    • 这个如果不用大模型的词向量,也可以自己用transfromer训练自己的词向量库,但是查询的时候用同样的词向量库计算查询此即可;建议可以用Sentence Transformer;
  • 下次用户查询时,先采用通用的过程对用户输入分词,查询词向量,然后在本地向量库中找到关联性强的数据作为上下文,然后输入到大模型;

向量运算过程示例:

向量存储

这里主要介绍下Faiss向量数据库;



请遵守《互联网环境法规》文明发言,欢迎讨论问题
扫码反馈

扫一扫,反馈当前页面

咨询反馈
扫码关注
返回顶部