使用Ollama和Go基于文本嵌入模型实现文本向量化

基于RAG+大模型的应用已经成为当前AI应用领域的一个热门方向。RAG(Retrieval-Augmented Generation)将检索和生成两个步骤相结合,利用外部知识库来增强生成模型的能力(如下图来自网络)。

a2d4912e185c38d9b43df5101f2971ad.png

在RAG赋能的大模型应用中,关键的一步是将文本数据向量化后存储在向量数据库中(如上图的红框),以实现快速的相似度搜索,从而检索与输入查询相关的文本片段,再将检索到的文本输入给生成模型生成最终结果。

本文是我学习开发大模型应用的一篇小记,探讨的是如何使用Ollama和Go语言实现文本数据的向量化处理,这是开发基于RAG的大模型应用的前提和基础。

要进行文本向量化,我们首先要了解一下文本向量化的方法以及发展。

纵观文本向量化技术的发展历程,我们可以看到从早期的词袋模型(Bag-of-Words)、主题模型(Topic Models),到词嵌入(Word Embedding)、句嵌入(Sentence Embedding),再到当前基于预训练的文本嵌入模型(Pretrained Text Embedding Models),文本向量化的方法不断演进,语义表达能力也越来越强。

但传统的词袋模型忽略了词序和语义,主题模型又难以捕捉词间的细粒度关系,词嵌入模型(如Word2Vec、GloVe)虽然考虑了词的上下文,但无法很好地表征整个句子或文档的语义。近年来,随着预训练语言模型(如BERT、GPT等)的崛起,出现了一系列强大的文本嵌入模型,它们在大规模语料上进行预训练,能够生成高质量的句子/文档嵌入向量,广泛应用于各类NLP任务中。下图是抱抱脸(https://huggingface.co/)的最新文本嵌入模型的排行榜[1]

36f5e2ebf905adf7a4c50b0163984cbe.png

目前,基于大型预训练语言模型的文本嵌入已成为主流方法。这些模型在大规模无监督语料上预训练,学习到丰富的语义知识,生成的文本嵌入能较好地编码词语、短语和句子等多个层面的语义关系。Nomic AI[2]等组织发布了多种优秀的预训练文本嵌入模型,应用效果获得了较大提升。这种基于预训练的文本嵌入模型来实现文本数据向量化的方法也缓解了Go语言生态中文本向量化的相关库相对较少的尴尬,Gopher可以在预训练文本嵌入模型的帮助下将文本向量化。接下来,我们就来看看如何基于Ollama和Go基于文本嵌入模型实现文本向量化。

考虑到实验环境资源有限,以及Ollama对Text Embedding模型的支持[3],这里我选择了Nomic AI开源发布的nomic-embed-text v1.5模型[4],虽然在抱抱脸上它的排名并不十分靠前。

在《使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B[5]》一文中,我已经粗略介绍过Ollama在本地运行大模型的基本步骤,如果你对Ollama的操作还不是很了解,可以先阅读一下那篇文章。

下面我们就用ollama下载nomic-embed-text:v1.5模型:

$ollama pull nomic-embed-text:v1.5
pulling manifest
pulling manifest
pulling 970aa74c0a90... 100% ▕██████████████████████████████████████████████████████████████████▏ 274 MB    
### 如何使用嵌入模型文本转换为向量并存储到向量数据库 #### 嵌入模型的工作流程 为了实现文本数据转化为可以被机器理解的形式,通常会经历一系列标准化的预处理阶段以及后续的向量生成过程。具体来说: - **文本预处理** 是指通过移除无关紧要的信息来优化原始文本的质量。这一步骤可能涉及删除停用词(如“the”,“is”)、标点符号以及其他噪声字符,并执行诸如分词归一化这样的操作[^1]。 - 接下来,在完成上述清理工作之后,需采用一种合适的嵌入技术或深度学习框架把经过净化后的词语映射成数值型表示形式——即所谓的高维度空间中的稠密向量。这些向量能够捕捉单词之间的语义关系,使得相似含义的内容拥有相近位置分布特征。 #### 向量数据库的选择与应用 一旦获得了代表各个文档片断或者句子意义表达的有效编码方式,则可考虑将其持久保存以便日后检索查询之用。目前市面上存在多种专为此目的设计开发出来的高效解决方案可供选用,其中包括但不限于Pinecone、Weaviate、FAISS Milvus 等工具平台。它们各自具备独特优势特性以满足不同场景需求下的性能指标要求。 以下是基于 Python 的简单示例代码展示如何创建一个基本管道用于从给定字符串集合构建其对应的矢量表现形式并将结果提交至选定的目标系统中去管理维护: ```python from sentence_transformers import SentenceTransformer import pinecone # 初始化 Pinecone 客户端连接参数配置 (替换为自己账户的具体信息) pinecone.init(api_key="your_api_key", environment="your_env") # 加载预先训练好的 BERT 变体作为我们的嵌入函数实例对象 model = SentenceTransformer('all-MiniLM-L6-v2') texts = ["example text one", "another piece of content"] # 将每条记录传递给模型得到相应的低维实数数组输出 embeddings = model.encode(texts) index_name = 'my-index' if index_name not in pinecone.list_indexes(): pinecone.create_index(index_name, dimension=embeddings.shape[1]) index = pinecone.Index(index_name=index_name) # 插入数据项进入索引结构内部等待进一步分析调用 for i, vec in enumerate(embeddings): index.upsert([(str(i), list(vec))]) ``` 此脚本首先定义了一个小型测试集 `texts` ,接着运用 Hugging Face 提供的开源库加载名为 all-MiniLM-L6-v2 的 transformer 架构版本充当实际计算逻辑核心组件;最后借助官方 API 方法逐步建立起远程服务端上的新表单实体及其关联属性字段布局安排情况概述说明如下所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值