LangChain的应用开发(二)
本文介绍了多模态聊天机器人和RAG技术的核心概念与应用。在多模态领域,系统支持语音、图片和视频处理,需通过URL或base64格式传输多媒体内容。RAG技术部分重点阐述了Embedding模型的发展历程,从静态Word2Vec到动态BERT等模型,以及向量数据库在语义搜索中的应用。文章详细比较了Chroma、FAISS和Milvus等向量数据库的特点,并展示了BGE-Large模型在中文RAG中的
一、多模态的聊天机器人
- 多模型调用和多模态模型的调用
- 保存历史聊天记录
- 修剪聊天上下文
- 形成摘要记忆
- 拥有web界面,方便用户使用
- 可以在线录制语音
- 可以处理语音、图片和视频
注意: 目前所有的多模态大模型,如果需要传入多媒体内容。只有两种方式:
1、传入多媒体文件的网络访问路径,比如: http://www..baidu.com/log.png
2、把多媒体文件转换为base64格式的字符串,再传入大模型。

二、RAG和Embeddings模型
1、什么是Embedding模型
Embedding模型是指将高维度的数据(例如文字、图片、视频)映射到低维度空间的过程。简单来说,embedding向量就是一个N维的实值向量,它将输入的数据表示成一个连续的数值空间中的点。
Embeddings的学习通常基于无监督或弱监督的方法。对于自然语言处理任务,常用的Embeddings方法包括Word2Vec、GloVe和FastText。这些方法可以从大规模的文本语料库中学习单词的分布式表示。对于计算机视觉任务,常用的Embeddings方法包括卷积神经网络(CNN)和循环神经网络(RNN)等。

通俗易懂的描述:嵌入就相当于给文本穿上了“数字化”的外衣,目的是让机器更好的理解和处理。
发展:由静态的Word Embedding(如Word2Vec、GloVe和FastText) -> 动态预训练模型(如ELMo、BERT、GPT、GPT-2、GPT-3、ALBERT、XLNet等)。大型语言模型可以生成上下文相关的 embedding 表示,可以更好地捕捉单词的语义和上下文信息。
向量空间(Vector Space)
所有的数据都变成向量,这些向量组成一个庞大的矩阵。在这个世界里,每个词、句子、图片、用户…都被表示成一个“点”(即向量),大家都有自己的“坐标”。
我们可以通过“距离”和“方向”来理解它们的关系。
Embedding 向量放在向量空间里,有啥用?
距离表示相似度
向量之间越近:意义越相似
向量之间越远:意义越不同
比如:
“苹果 🍎” 和 “香蕉 🍌” 的向量夹角小(近) → 都是水果
“苹果 🍎” 和 “MacBook 💻” 的向量略远 → 一个是水果,一个是电子产品

使用场景
- Embeddings可以在各种机器学习任务中使用,包括分类、聚类、检索和推荐等。
- 在自然语言处理任务中,可以使用静态预训练的Embeddings模型,如Word2Vec、GloVe和FastText,来生成单词的向量表示。这些预训练的Embeddings模型通常在大规模的文本数据上进行训练,可以用于处理不同的自然语言处理任务,如情感分析、命名实体识别和机器翻译等。
- 在计算机视觉任务中,可以使用卷积神经网络(CNN)提取图像的特征向量,然后使用这些特征向量进行分类、检索和生成等任务。另外,通过将图像与文本进行联合训练,可以学习到图像和文本之间的语义关系,从而实现图像与文本的检索和生成等任务。
- 我们在做RGA开发时又会涉及到向量数据库,在创建向量数据库时又需要使用Embedding模型对文本进行向量化处理。在检索的时候,需要对用户输入进行向量化处理也需要用到。
解决问题
- 降维:在高维度空间中,数据点之间可能存在很大的距离,使得样本稀疏,嵌入模型可以减少数据稀疏性。
- 捕捉语义信息:Embedding不仅仅是降维,更重要的是,它能够捕捉到数据的语义信息。语义相近的词在向量上也是相近的
- 特征表示:原始数据的特征往往难以直接使用,通过嵌入模型可以将特征转换成更有意义的表示。
- 计算效率:在低维度空间中对数据进行处理和分析往往更加高效。
独热编码(One-Hot Encoding)
是一种将数据转换为二进制向量的技术。它的主要目的是将分类变量转换为机器学习算法能够处理的格式,从而避免数值关系的误判。
举例:词表中有 10,000 个词,每个词都用一个只有一个 1,其它全是 0 的向量来表示。

这样的向量是:
📏 高维(非常长,比如 10k、100k…)
⚪ 稀疏(只有一个 1,其他都是 0)
🧱 没有语义信息(“猫”和“狗”之间毫无关系)

2、langchain的文本嵌入模型(Embeddings)
嵌入模型创建文本片段的向量表示。您可以将向量视为一个数字数组,它捕捉了文本的语义含义。 通过这种方式表示文本,您可以执行数学运算,从而进行诸如搜索其他在意义上最相似的文本等操作。

Embeddings 类是一个用于与文本嵌入模型接口的类。有很多嵌入大模型供应商(OpenAI、Hugging Face,BGE 等) - 这个类旨在为它们提供一个标准接口。
LangChain 中的基础 Embeddings 类提供了两个方法:一个用于嵌入文档,一个用于嵌入查询。前者,.embed_documents,接受多个文本作为输入,而后者,.embed_query,接受单个文本。将这两个方法分开是因为某些嵌入大模型供应商对文档(待搜索的内容)和查询(搜索查询本身)有不同的嵌入方法。 .embed_query 将返回一个浮点数列表,而 .embed_documents 返回一个浮点数列表的列表。
3、私有化部署Qwen3-Embedding

生产环境中的Embeddings模型对比

点击图片可查看完整电子表格
为了部署Embedding模型,我们需要引入对应的工具库,目前主要有几类:
- Sentence-Transformers: Sentence-Transformers库是基于HuggingFace的Transformers库构建的,它专门设计用于生成句子级别的嵌入。它引入了一些特定的模型和池化技术,使得生成的嵌入能够更好地捕捉句子的语义信息。Sentence-Transformers库特别适合于需要计算句子相似度、进行语义搜索和挖掘同义词等任务。
- HuggingFace Transformers: HuggingFace的Transformers库是一个广泛使用的NLP库,它提供了多种预训练模型,如BERT、GPT-2、RoBERTa等。这些模型可以应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。Transformers库支持多种编程语言,并且支持模型的微调和自定义模型的创建。虽然Transformers库的功能强大,但它主要关注于模型的使用,而不是直接提供句子级别的嵌入。
- Langchain集成的HuggingFaceBgeEmbeddings。与3一样。
- FlagEmbedding: 这是一个相对较新的库,其核心在于能够将任意文本映射到低维稠密向量空间,以便于后续的检索、分类、聚类或语义匹配等任务。FlagEmbedding的一大特色是它可以支持为大模型调用外部知识,这意味着它不仅可以处理纯文本数据,还能整合其他类型的信息源,如知识图谱等,以提供更丰富的语义表示。
总的来说,FlagEmbedding强调的是稠密向量的生成和外部知识的融合;HuggingFace Transformers提供了一个广泛的预训练模型集合,适用于多种NLP任务;而Sentence-Transformers则专注于生成高质量的句子嵌入,适合那些需要深入理解句子语义的应用场景。
4、BGE-Large的Embadding+Huggingface私有化
HuggingFace 上的 BGE 模型是最好的开源嵌入模型之一。 BGE 模型由北京人工智能研究院 (BAAI) 创建。 是一家从事 AI 研发的私营非营利组织。
BGE-Large(智源研究院)和GTE-Large(阿里巴巴)(6月之前)是当前中文RAG领域主流的开源Embedding模型,两者的核心区别与优势如下:

配置HuggingFace镜像站:https://hf-mirror.com/


|
Plain Text |
|
Plain Text |
在 HuggingFaceBgeEmbeddings 中,normalize_embeddings 参数通常只接受布尔值(True 或 False),用于决定是否对生成的嵌入向量进行归一化处理。具体来说:
- True:生成的嵌入向量会被归一化为单位向量。这意味着每个嵌入向量的 L2 范数(欧几里得长度)将被缩放到 1。
- False:生成的嵌入向量将保持原始的数值,不进行归一化处理。
- 优点 :
- 提高相似度计算的稳定性 :在许多应用场景中,如余弦相似度计算,归一化后的向量可以避免因向量长度不同而导致的相似度偏差,使相似度计算更加专注于向量的方向而非长度。
- 一致性 :在某些情况下,归一化可以确保不同批次或不同模型生成的嵌入向量在同一尺度上,便于比较和整合。
案例:根据语义搜索美食评论数据

余弦距离(Cosine Distance)的计算,用于衡量两个向量在方向上的相似性。代表 文本语义的相似性

||a|| : 计算向量 a 的欧几里得范数(L2范数),即向量的长度。公式为 sqrt(a₁² + a₂² + ... + aₙ²)
ab: 计算向量 a 和 b 的点积(内积),即对应元素相乘后求和。
5、向量数据库
存储和搜索非结构化数据的最常见方法之一是将其嵌入并存储生成的嵌入向量, 然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。 向量存储负责存储嵌入数据并执行向量搜索, 为您处理这些。
Chroma
Chroma 是一个开源的向量数据库,专注于简化文本嵌入的存储和检索过程。Chroma 采用 Apache 2.0 许可证。它的主要特点包括:
- 支持多种存储后端:Chroma支持多种底层存储选项,如DuckDB(适用于独立应用)和ClickHouse(适用于大规模扩展)。
- 多语言支持:Chroma提供了Python和JavaScript/TypeScript的SDK,方便开发者快速集成。
- 简单易用:Chroma的设计理念是“简单至上”,旨在提升开发者的效率。
- 高性能:Chroma不仅支持快速的相似度搜索,还提供了对搜索结果的分析功能。
FAISS
Faiss是由Facebook AI Research团队开发的一个库,旨在高效地进行大规模向量相似性搜索。它不仅支持CPU,还能利用GPU进行加速,非常适合处理大量高维数据。Faiss提供了多种索引类型,以适应不同的需求,从简单的平面索引(Flat Index)到更复杂的倒排文件索引(IVF)和乘积量化索引(PQ)。
Milvus
Milvus 基本介绍
- Milvus 由 Zilliz 开发,并捐赠给了 Linux 基金会下的 LF AI & Data 基金会,现已成为世界领先的开源向量数据库项目之一
- 什么是向量数据库:传统的数据库主要处理结构化数据,而向量数据库则专注于处理非结构化数据经过嵌入模型(embedding model)转换而来的向量数据。这些向量是高维空间中的点,它们捕获了原始数据的语义信息。向量数据库的核心能力是进行相似性搜索,即根据查询向量找到最相似的向量,从而实现语义级别的搜索和匹配。
- Milvus 采用 Apache 2.0 许可发布,大多数贡献者都是高性能计算(HPC)领域的专家,擅长构建大规模系统和优化硬件感知代码
6、RAG案例
RAG:Retrieval-Augmented Generation 检索增强生成。RAG通过结合LLMs的内在知识和外部数据库的非参数化数据,提高了模型在知识密集型任务中的准确性和可信度。

上下文感知的检索器

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)