我正在使用
OpenAIEmbeddings()
中的 OpenAI
类,它使用 text-embedding-3-small
模型。根据文档,它为任何输入文本生成一个 1536 维向量。
但是,我对它的工作原理有点困惑:
我期待这个:
如果我的输入文本中有 100 个单词,我预计 OpenAIEmbeddings() 将输出 100 个向量,每个向量的大小为 1536。
但输出是整个输入文本的大小为 1536 的单个向量。
为什么我会期待这个?
因为在我的学习中,我了解到像 Word2Vec 或 GloVe 这样的嵌入为语料库中的每个单词提供向量。这与 OpenAIEmbeddings 采取的方法有何不同?
我试图了解是否有一种方法可以使用此模型提取单个单词的嵌入,或者输出是否始终是代表整个输入的单个向量。
任何见解或例子将不胜感激!
您所描述的一切都是 100% 符合预期的。
答:是的。
答:首先,OpenAI Embeddings 模型处理的单个单词与长文本没有任何不同。对于模型来说,它是一个输入。输入甚至可以是单个字符(例如“a”),但计算它的嵌入向量是没有意义的,因为“a”在语义上对我们人类来说没有任何意义。
其次,您对这个问题的意思可能是当您使用这些嵌入进行相似性搜索时会发生什么。换句话说,当您“使用”它们时会发生什么?如果您使用单词、句子、段落或整个文本的嵌入,会发生什么?有关系吗?是的! 这称为分块。关于如何对文本进行分块的决定取决于用例。最好的办法可能就是简单地尝试看看。如果在进行相似性搜索后获得有意义的结果,则这意味着分块是合适的(即使这意味着对整个文本进行分块)。如果在进行相似性搜索后没有得到有意义的结果,则意味着分块不合适(例如,不要按段落分块,而是尝试按句子分块)。
有一篇关于这个主题的优秀 Stack Overflow
博客文章使用 RAG,您可以为您所使用的数据片段创建文本嵌入 想要从中提取和检索。这允许你放置一块 法学硕士用来创建的语义空间中的源文本 回应。/.../
当涉及 RAG 系统时,您需要特别注意 各个数据块有多大。如何划分数据 称为分块,它比嵌入整体更复杂 文件。
/.../
分块数据的大小将会产生巨大的差异 搜索中会出现哪些信息。当你嵌入一段数据时, 整个事情被转换成一个向量。
包含太多内容 块和向量失去了特定于它的任何东西的能力 讨论。包含的内容太少,您就会丢失数据的上下文。