前言
LangGraph中的代理检索增强生成(RAG)全称为Agentic Retrieval-Augmented Generation
简单来说,RAG 就像是给大型语言模型(LLM)装了一个“外挂”,让它能够用到最新的、相关的或者私密的信息,从而更好地回答问题。这个技术特别适合问答机器人、客服系统,还有那些需要针对特定数据提供见解的场景。
LLM 虽然很厉害,但它有个“知识截止日期”,之后的知识就不知道了。RAG 就是通过检索机制,从提前整理好的数据里找到有用的信息,然后结合 LLM 的能力,生成针对用户问题的答案。
RAG 主要有两个关键部分:
- 索引:就是把数据整理好,方便快速找到需要的内容。
- 检索和生成:当用户提问时,先找到相关的数据,再用 LLM 的能力生成回答。
具体来说,RAG 需要完成两个主要流程:
- 数据索引:把数据分成小块,然后存起来,方便搜索。
- 查询处理:根据用户的问题,找到相关的数据块,然后生成合适的回答。
总之,RAG 就是让 LLM 能够更好地利用外部信息,更聪明地回答问题。
Embeddings
什么是嵌入(Embeddings)?
嵌入是一种把复杂的数据(比如单词、句子)转换成一组数字的方法。这些数字就像一个“代码”,能够把数据的意思或者特征“打包”起来,让机器更容易理解。你可以把它想象成把单词、短语或者文档变成机器能处理的数字形式,但同时尽量保留它们本来的意思。
比如说,在自然语言处理(NLP)里,一个单词嵌入可以把“cat”(猫)这个词变成一个数字向量,让它在数字空间里离“kitten”(小猫)或者“dog”(狗)这样的词更近,因为它们意思相近,而不是因为它们拼写相似。
嵌入是什么样的?
一个单词或短语的嵌入看起来可能是一串数字,比如:
[0.32, -0.45, 1.67, 0.25, -0.09, ... , -0.65]
这个向量里的每一个数字都代表了一个“维度”,用来捕捉这个词意思的一个独特方面。这些数字是根据嵌入的训练数据得出来的。
对我们来说,这只是一串数字,但对机器来说,这串数字就像是一个“小包裹”,里面装着这个词的意思,而且这个表示方式很紧凑,很有意义。
流行的嵌入类型
1. OpenAI 嵌入
- 介绍:基于 GPT 的嵌入,很擅长捕捉广泛的知识。
- 优点:因为是在海量、多样化的数据上训练的,所以适合各种通用的自然语言处理任务。
- 缺点:计算成本高,对特别专业的数据不够“贴身”。
2. Sentence-BERT(SBERT)
- 介绍:常用来比较句子或段落之间的相似性。
- 优点:专门优化了句子级别的比较,非常适合问答和文档检索。
- 缺点:如果遇到复杂、微妙的文本,而这些文本和它的训练数据不匹配,效果可能会打折扣。
3. Doc2Vec
- 介绍:适合处理大段文本,比如文档或章节。
- 优点:能够处理整个文档,非常适合文档聚类和分类。
- 缺点:在单词或句子级别的细粒度相似性比较上不太行。
4. FastText
- 介绍:Facebook AI 开发的模型,能捕捉词内部的信息,比如词根、词缀,对罕见词或专有名词很有效。
- 优点:在处理复杂词形变化的语言或者生僻词时特别厉害。
- 缺点:相比大型模型,可能对语义的理解不够细腻。
5. TF-IDF 嵌入
- 介绍:经典的“词频 - 逆文档频率”方法,虽然简单,但对有些应用来说很有效。
- 优点:速度快,计算成本低,适合基于关键词的简单检索。
- 缺点:因为它只看词频,所以缺乏对上下文的深度理解。
简单来说,这些嵌入各有各的“拿手活”,选择哪种取决于你要解决的问题!
相关资料和论文
1. Word2Vec(Mikolov 等人,2013)
- 核心概念:Word2Vec 是一种用神经网络生成密集单词向量的方法。它的核心思想是“相似的上下文,相似的词”,也就是说,经常出现在相似上下文中的词,在向量空间里会被放得很近。
- 例子:比如,“猫”和“狗”经常出现在宠物相关的上下文中,所以它们的向量会很接近。
2. GloVe(全局词向量,Pennington 等人,2014)
- 核心概念:GloVe 是一种基于统计的方法,通过分析整个语料库中词的共现关系来学习词之间的关系。
- 例子:如果“猫”和“宠物”经常一起出现,那么它们的向量就会反映出这种关系。GloVe 的特点是它会考虑全局的词频信息。
3. BERT(Devlin 等人,2018)
- 核心概念:BERT 和后来的模型(比如 RoBERTa 和 DistilBERT)引入了一种能够捕捉上下文中词关系的嵌入方法。BERT 的特点是它可以根据上下文动态生成词向量,而不是固定不变的。
- 例子:比如“银行”这个词,在“河边的银行”和“银行的利率”中,BERT 能生成不同的向量,因为它能理解上下文。
从大型语言模型(LLM)中提取的嵌入模型
什么是基于 LLM 的嵌入模型?
像 OpenAI 的 GPT、Google 的 BERT 或 Meta 的 LLaMA 这样的大型语言模型(LLM)生成的嵌入模型,彻底改变了我们从文本中提取语义信息的方式。这些模型生成的嵌入能够捕捉语言中的复杂细节,比如上下文、细微差别、语法和语义,这比传统的嵌入技术厉害多了。
为什么用基于 LLM 的嵌入?
基于 LLM 的嵌入(比如 BERT 或 GPT 的嵌入)有以下几个好处:
-
捕捉上下文中的意思:这些嵌入可以根据周围的词动态调整,能够理解句子或短语中的具体含义。比如,“苹果”在“苹果手机”和“苹果树”中,嵌入会不一样,因为它能理解上下文。
-
动态、任务专用的表示:这些嵌入可以根据不同的任务(比如问答或者文本总结)调整自己的表示方式。比如,同一个句子在问答任务和翻译任务中,嵌入可能会有所不同,因为任务的需求不一样。
-
支持迁移学习:这些嵌入是在海量数据上预训练的,能够很好地适应各种不同的任务和行业。比如,一个在新闻数据上训练好的嵌入模型,也可以用在医疗文本分析上,因为它有很强的泛化能力。
简单来说,基于 LLM 的嵌入就像是一个“智能翻译器”,能够根据不同的场景和任务,灵活地理解语言的复杂性。