什么是文本向量化 Text Embedding
很多刚接触AI开发的兄弟肯定会遇到很多新的概念,一脸懵逼,比如向量化,比如Embedding。
首先它俩其实是一回事。Embedding就是负责将文本或者图片、视频等变成向量的一种技术。这里我们只聊文本Embedding。
那么这种技术有什么用?简单说就是让机器能够理解语义。我们都知道现在的AI 人工智能之所以牛逼,就是它好像真的能理解人类语言了,能听懂人说的是什么,然后给出符合人类预期的回答,这一切都是基于Embedding技术实现的。
它是怎么实现的,这里就不详细展开了,我们直接开始展示这个功能怎么用。
前置准备
-
向量数据库
专门用于存储和查询向量的数据库,商用的有腾讯云的,可以本地化部署的有Milvus,Postgresql+pgvector插件,最新版的elasticsearch 等等。 -
Embedding模型
负责将文本向量化的大模型,基本所有商用的ai大模型都提供了对应的embedding接口,比如openai、百川、千问等等,ollama里所有的大模型也可以通过/api/embeddings
接口调用其embedding能力。但有几点要注意:- 不同的大模型,embedding后的结果不一样,它们不是通用的,不能用A大模型embedding的结果存到数据库里,下次用了B大模型embedding的结果去匹配。
- 不同的embedding模型,生成的向量维度不同,这个要明确是多少,比如百川的是1024维,openai的有1536维的还有3072维的,这关系到数据库建表的时候向量字段怎么定义,表一旦建好就不可更改了
- 不同的embedding模型,允许输入的文本长度也不同,比如openai最大允许输入8k多长度的文本,百川只允许512,这个长度就限制了你需要将一个大的文本比如一整篇文章,拆成多少段存到数据库中
-
JBolt AI 我们自研的,基于JBolt平台底座打造的Java企业级AI数智化应用极速开发平台,提供AI辅助系统设计,可视化代码生成与自动化模块构建,零代码AI知识库应用开发,零代码AI智能体(Agent)工具箱等核心能力,是国内领先的Java企业级AIGS解决方案。
开搞
- 首先通过JBolt AI,注册一个embedding大模型资源
ResourceCenter.registerEmbedding("id_xxx", EmbeddingModel.OPENAI, "api_key_****")
.setApiUrl("https://代理地址/v1/embeddings");
- 调用JBolt AI的Embeding能力,将文本向量化
JBoltEmbedding.embedding(EmbeddingModel.OPENAI,
"AIGS通过生成式人工智能来重新构建企业软件,以提升企业软件的用户体验和开发效率。极大的改善B端企业软件的使用体验,大部分场景构建全新的语音/对话交互模式,取代了旧的交互方式,通过更强大的语义理解能力,用户只需要自然语言就可以实现与系统交互,完成复杂的数据交互任务。",
"JBoltAI是基于JBolt平台底座打造的Java企业级AI数智化应用极速开发平台,提供AI辅助系统设计,可视化代码生成与自动化模块构建,零代码AI知识库应用开发,零代码AI智能体(Agent)工具箱等核心能力,是国内领先的Java企业级AIGS解决方案。")
.onSuccess((event, vectors) -> {
System.out.println("收到" + vectors.size() + "段文本的向量化结果:");
for (int i = 0; i < vectors.size(); i++) {
System.out.println("第" + (i+1) +"段文本:" + JSON.toJSON(vectors.get(i)));
}
}).publish().await();
- 注册一个向量数据库资源,这里用Milvus演示
ResourceCenter.registerMilvusVDB("main", "http://192.168.31.14:19530", "root", "Milvus", EmbeddingModel.OPENAI)
.setDatabase("aisdk");
- 用JBolt AI在Milvus数据库中建一个表,用于存文本,表中会自动创建一个doc字段存原始文本和一个vector字段存向量化结果,这里演示我们再额外加两个字段,int类型的type和string类型的name
List<VDBField> fields = Arrays.asList(
VDBField.ofNormal("name", VDBFieldType.STRING),
VDBField.ofNormal("type", VDBFieldType.NUMBER32),
VDBField.ofFlatVector()
);
VDBOptResult<Boolean> result = JBoltVDB.use("main").createCollection("test", fields);
System.out.println("创建成功?" + result.isSuccess());
使用工具查看MIlvus中的表:
- 使用JBolt AI,向数据库插入文本,框架会自动将这些文本向量化后插入数据库中,不需要手动调用embedding
JBoltVDB.use().insert("test", IdUtil.fastSimpleUUID(),"AIGS通过生成式人工智能来重新构建企业软件,以提升企业软件的用户体验和开发效率。极大的改善B端企业软件的使用体验,大部分场景构建全新的语音/对话交互模式,取代了旧的交互方式,通过更强大的语义理解能力,用户只需要自然语言就可以实现与系统交互,完成复杂的数据交互任务。", "name", "什么是AIGS", "type", 1);
JBoltVDB.use().insert("test", IdUtil.fastSimpleUUID(),"JBoltAI是基于JBolt平台底座打造的Java企业级AI数智化应用极速开发平台,提供AI辅助系统设计,可视化代码生成与自动化模块构建,零代码AI知识库应用开发,零代码AI智能体(Agent)工具箱等核心能力,是国内领先的Java企业级AIGS解决方案。", "name", "JBolt AI介绍", "type", 2);
- 模拟用户提问,看数据库能匹配到啥
VDBOptResult<List<VDBDoc>> result = JBoltVDB.use().search("test", new VDBConditions().matchText("我想开发个智能应用,可以用哪些框架?").limit(1));
if (result.isSuccess()) {
for (VDBDoc vdbDoc : result.getResult()) {
System.out.println("---"+ vdbDoc.getId() + ":" + vdbDoc.getDoc());
}
}
- 拿到了匹配到的原文本,后面就是把问题和匹配的原始文本,交给大模型加工,重新生成回答。
往期文章:
JAVA开发AI应用(一):调用大模型实现基本聊天
JAVA开发AI应用(二):调用大模型实现上下文聊天
JAVA开发AI应用(三):调用大模型实现多模态聊天
JAVA开发AI应用(四):实现复杂的业务流程1
JAVA开发AI应用(五):实现复杂的业务流程2 意图识别
关于我们
我们是山东向量空间人工智能科技有限公司,一家专注于做人工智能领域应用和解决方案的公司,欢迎大家一起交流。