JAVA开发AI应用(六):调用Embedding大模型实现RAG(检索增强)

什么是文本向量化 Text Embedding

很多刚接触AI开发的兄弟肯定会遇到很多新的概念,一脸懵逼,比如向量化,比如Embedding。

首先它俩其实是一回事。Embedding就是负责将文本或者图片、视频等变成向量的一种技术。这里我们只聊文本Embedding。

那么这种技术有什么用?简单说就是让机器能够理解语义。我们都知道现在的AI 人工智能之所以牛逼,就是它好像真的能理解人类语言了,能听懂人说的是什么,然后给出符合人类预期的回答,这一切都是基于Embedding技术实现的。

它是怎么实现的,这里就不详细展开了,我们直接开始展示这个功能怎么用。

前置准备

  • 向量数据库
    专门用于存储和查询向量的数据库,商用的有腾讯云的,可以本地化部署的有Milvus,Postgresql+pgvector插件,最新版的elasticsearch 等等。

  • Embedding模型
    负责将文本向量化的大模型,基本所有商用的ai大模型都提供了对应的embedding接口,比如openai、百川、千问等等,ollama里所有的大模型也可以通过/api/embeddings接口调用其embedding能力。但有几点要注意:

    1. 不同的大模型,embedding后的结果不一样,它们不是通用的,不能用A大模型embedding的结果存到数据库里,下次用了B大模型embedding的结果去匹配。
    2. 不同的embedding模型,生成的向量维度不同,这个要明确是多少,比如百川的是1024维,openai的有1536维的还有3072维的,这关系到数据库建表的时候向量字段怎么定义,表一旦建好就不可更改了
    3. 不同的embedding模型,允许输入的文本长度也不同,比如openai最大允许输入8k多长度的文本,百川只允许512,这个长度就限制了你需要将一个大的文本比如一整篇文章,拆成多少段存到数据库中
  • JBolt AI 我们自研的,基于JBolt平台底座打造的Java企业级AI数智化应用极速开发平台,提供AI辅助系统设计,可视化代码生成与自动化模块构建,零代码AI知识库应用开发,零代码AI智能体(Agent)工具箱等核心能力,是国内领先的Java企业级AIGS解决方案。

开搞

  1. 首先通过JBolt AI,注册一个embedding大模型资源
ResourceCenter.registerEmbedding("id_xxx", EmbeddingModel.OPENAI, "api_key_****")
                .setApiUrl("https://代理地址/v1/embeddings");
  1. 调用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();

在这里插入图片描述

  1. 注册一个向量数据库资源,这里用Milvus演示
ResourceCenter.registerMilvusVDB("main", "http://192.168.31.14:19530", "root", "Milvus", EmbeddingModel.OPENAI)
                .setDatabase("aisdk");
  1. 用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中的表:
在这里插入图片描述

  1. 使用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);

在这里插入图片描述

  1. 模拟用户提问,看数据库能匹配到啥
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());
            }
        }

在这里插入图片描述

  1. 拿到了匹配到的原文本,后面就是把问题和匹配的原始文本,交给大模型加工,重新生成回答。

往期文章:
JAVA开发AI应用(一):调用大模型实现基本聊天
JAVA开发AI应用(二):调用大模型实现上下文聊天
JAVA开发AI应用(三):调用大模型实现多模态聊天
JAVA开发AI应用(四):实现复杂的业务流程1
JAVA开发AI应用(五):实现复杂的业务流程2 意图识别

关于我们

我们是山东向量空间人工智能科技有限公司,一家专注于做人工智能领域应用和解决方案的公司,欢迎大家一起交流。

在这里插入图片描述

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值