1 介绍

模型 Embedding 是一种将高维数据转换为低维向量的技术,通常用于自然语言处理和机器学习领域。比如在自然语言处理中,就是把一句或一段话转成一个多维向量。它能捕捉词汇或数据之间的语义关系。在词嵌入中,类似意义的词会被映射到相近的向量空间中。

Embedding 常常用于信息检索、文本分类、语义匹配等场景中。比如建立本地知识库时,一般会先将文本切分,再进行 Embedding,然后将其存储在向量数据库中,以便后续查找和使用。

2 方法

嵌入方法有很多种。比如,可以调用 OpenAI 提供的嵌入方法,这需要花钱;也可以使用 Ollama 方法调用本地嵌入模型,这需要在本地搭建 Ollama 服务;或者直接在程序中调用模型,无需依赖其它工具。

2.1 最简单的 Embedding 方法

在程序中直接使用模型生成嵌入

1
2
3
4
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('uer/sbert-base-chinese-nli')
sentences = ["测试","这是一个苹果"]
sentence_embeddings = model.encode(sentences)

2.2 Openai Embedding

调用 openai Embedding 嵌入

1
2
3
4
5
6
7
8
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# https://api.openai.com/v1/embeddings
openai.Embedding.create(
model="text-embedding-ada-002",
input="The food was delicious and the waiter..."
)

2.3 Ollama Embedding

使用部署在本地的 ollama 服务生成嵌入

1
$ curl http://localhost:11434/api/embeddings -d '{ "model": "nomic-embed-text", "prompt": "The sky is blue because of Rayleigh scattering" }'

python 代码见 langchain 部分

2.4 langchain

包含很多种不同平台的 api 调用方式,也是比较推荐的方法:方法简单,功能灵活。

1
from langchain.embeddings.xxx

2.4.1 切分

1
2
3
4
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
all_splits = text_splitter.split_text(data)

2.4.2 取嵌入

1
2
3
4
from langchain.embeddings import OllamaEmbeddings

oembed = OllamaEmbeddings(base_url="http://localhost:11434", model="mofanke/dmeta-embedding-zh") # chinese embedding model
embeddings = [oembed(text) for text in all_splits]

2.5 参考