目录
一、前言
二、RAG技术介绍
2.1 RAG是什么
2.2 RAG工作原理
2.3 RAG优势
2.4 RAG应用场景
三、在线大模型平台RAG技术使用
3.1 阿里百炼平台
3.1.1 创建知识库
3.1.2 导入文档数据
3.1.3 文档数据解析
3.1.4 查看数据
3.2 百度文心智能体
3.2.1 创建知识库
3.3 智谱AI开放平台
3.3.1 新建知识库
3.3.2 上传文档
四、Java对接RAG技术
4.1 向量数据库介绍
4.1.1 什么是向量数据库
4.1.2 向量数据库基本概念
4.1.3 向量数据库主要功能
4.1.4 向量数据库优势
4.1.5 向量数据库应用场景
4.2 Java对接阿里向量数据库
4.2.1 maven工程中导入核心依赖
4.2.2 文本嵌入模型
4.3 百炼平台通用向量数据库
4.3.1 使用SDK嵌入文本
4.3.2 HTTP调用
4.4 自建向量数据库Milvus
4.4.1 获取Docker Compose文件
4.4.2 启动容器
4.5 Java代码操作Milvus
4.5.1 引入依赖
4.5.2 创建集合
4.5.3 集合插入数据
五、写在文末
一、前言
随着AI大模型的兴起和运用,企业或个人对于大模型的定制化能力的需求也越来越明显。像GPT刚问世时,大家对大模型的认知为模型对话,语言理解等,到当前的阶段,人们开始希望大模型能够私有化、个性化、定制化的提供特定的能力,以满足日益增长的个性化需求。举例来说,企业或个人都希望拥有一款属于自己的AI助手,能够帮自己随时解决一些特定场景或特定领域的问题,在这种场景下,AI大模型中的RAG技术就派上用场了,简单来说,它就是一款可以问你量身打造的大模型知识库,当你需要某个知识的时候为你提供比较精准的答案,本文将详细介绍下RAG技术和实战。
二、RAG技术介绍
2.1 RAG是什么
RAG(Retrieval-Augmented Generation)是一种结合了检索和生成模型的技术,用于提高自然语言处理任务的性能。它由Facebook AI Research在2020年提出,旨在解决传统序列到序列(seq2seq)模型在处理开放域问答等任务时遇到的信息封闭问题。传统模型只能基于训练时学到的知识生成答案,而无法访问最新的或外部信息。RAG通过将检索机制与生成模型相结合,使得模型能够利用外部知识库中的最新信息来增强其回答。
通俗来讲,RAG模型在生成文本之前,会先从外部知识库中检索相关信息,然后将这些信息与组Prompt一起输入给模型,这样相当于模型有了你的私域知识,自然可以针对性地给你回答。
2.2 RAG工作原理
如下是一张关于RGA技术的原理图
从上面的图不难看出,RAG的工作流程可以分为下面几个步骤:
-
文档切片/分块
-
在企业级应用场景中,文档尺寸可能非常大,因此需要将长篇文档分割成多个文本块,以便更高效地处理和检索信息。分块的方式有很多种,比如按段落、按内容或者其他特殊结构。同时,需要注意分块的尺寸,如果分块太小,虽然查询更精准,但召回时间更长;如果分块太大,则会影响查询精准度。
-
-
嵌入模型
-
嵌入模型的核心任务是将文本转换为向量形式,这样我们就能通过简单的计算向量之间的差异性,来识别语义上相似的句子。
-
-
存入向量数据库
-
将文档切片和嵌入模型的结果存储进入向量数据库。向量数据库主要优势在于,它能够根据数据的向量接近度或相似度,快速、精确地定位和检索数据,实现很多传统数据库无法实现的功能,比如根据旋律和节奏搜索出特定的歌曲、在电影中搜索浪漫的片段、在文档中找出意图相近的段落等等。
-
-
用户查询检索
-
用户的问题会被输入到嵌入模型中进行向量化处理,然后系统会在向量数据库中搜索与该问题向量语义上相似的知识文本或历史对话记录并返回,这就是检索增强。
-
-
生成问答
-
最终将用户提问和上一步中检索到的信息结合,构建出一个提示模版,输入到大语言模型中,由大模型生成最终的结果并返回。
-
2.3 RAG优势
RAG技术的出现和使用,使得AI系统在以下下面一些场景下具有显著优势:
-
信息更新及时
-
由于RAG能够访问外部知识源,因此它可以提供包含最新信息的答案,这在快速变化的领域(如新闻、医疗健康)尤为重要。
-
-
知识丰富
-
通过利用外部知识库,RAG可以生成更丰富、详细和准确的答案。
-
-
使用灵活
-
RAG框架支持多种类型的检索器和生成模型,可以根据具体任务需求选择合适的组件组合。
-
-
个性化定制
-
通过检索外部知识库,RAG模型可以根据用户的特定需求生成个性化的输出。达到生成个人或企业的专属AI的效果。
-
-
准确性好
-
RAG模型在生成文本时,结合了外部知识库的信息,因此生成的内容更加准确和可靠。这对于需要高精度输出的场景(如法律咨询、医疗诊断等)尤为重要。
-
-
可解释性强
-
由于RAG模型在生成文本时引入了外部知识,因此生成的结果更加可解释。用户可以清楚地看到模型是如何利用外部知识来生成最终输出的。
-
-
对接简单
-
目前已经有很多成熟的RAG库,或者工具,你可以很简单地完成对应搭建,相比于模型微调,RAG是更简单的可以构建私域的方式。
-
2.4 RAG应用场景
RAG(Retrieval-Augmented Generation)技术因其结合了检索和生成模型的优势,在多个领域和应用场景中展现出强大的潜力。以下是RAG技术的一些典型应用场景和领域:
-
问答系统
-
场景描述:在客服、教育、医疗、企业内部知识库等领域,RAG技术可以用于构建更为智能的问答系统。
-
应用示例
-
客服机器人:帮助客户快速找到产品信息、解决常见问题。
-
教育平台:为学生提供详细的学科知识解答,辅助学习。
-
医疗咨询:提供最新的医疗研究和临床试验信息,辅助医生诊断和治疗。
-
-
-
内容生成
-
场景描述:RAG技术可以用于新闻生成、技术文档编写、创意写作等需要结合最新信息的内容创作任务。
-
应用示例
-
新闻报道:快速生成基于最新事件的新闻摘要和报道。
-
技术文档:结合最新的技术资料,生成详细的用户手册和开发文档。
-
创意写作:辅助作家创作小说、剧本等,提供灵感和背景信息。
-
-
-
对话系统
-
场景描述:RAG技术可以帮助聊天机器人更好地理解用户的意图,并提供更加个性化和准确的回复。
-
应用示例:
-
客户服务:在电商、银行等行业,提供个性化的客户服务和支持。
-
虚拟助手:在智能家居、个人助理等场景中,提供更自然的交互体验。
-
-
-
在线教育
-
场景描述:在线教育平台可以利用RAG技术为学习者提供定制化的学习材料和答案。
-
应用示例:
-
个性化学习:根据学生的学习进度和兴趣,生成个性化的学习计划和练习题。
-
即时答疑:为学生提供即时的、准确的学术问题解答。
-
-
-
新闻摘要与报道
-
场景描述:RAG技术可以帮助新闻机构快速生成新闻摘要或报道,综合不同来源的信息。
-
应用示例:
-
新闻聚合:从多个新闻源中提取关键信息,生成全面、客观的新闻报道。
-
专题报道:针对特定事件或话题,生成详细的专题报道和分析。
-
-
-
技术支持
-
场景描述:在技术支持领域,RAG技术可以辅助技术人员快速定位问题并提供解决方案。
-
应用示例:
-
故障排查:帮助技术支持人员快速找到相关的技术文档和解决方案。
-
用户指南:生成详细的用户操作指南和常见问题解答。
-
-
-
法律合规性查询
-
场景描述:RAG技术可以用于法律咨询服务,通过检索法律数据库、案例法、法规等,帮助律师快速生成法律意见书或案件分析报告。
-
应用示例:
-
法律咨询:提供最新的法律条文和案例分析,辅助律师提供法律建议。
-
合规审查:帮助企业快速查找和理解相关法规,确保合规运营。
-
-
-
金融分析报告
-
场景描述:在金融分析中,RAG技术可以检索市场数据、公司财务报告、经济指标等,生成投资分析报告,为投资者提供决策支持。
-
应用示例:
-
投资建议:结合最新的市场动态和财务数据,生成投资建议和分析报告。
-
风险管理:提供基于最新数据的风险评估和管理建议。
-
-
-
医疗咨询
-
场景描述:RAG技术在医疗领域可以辅助医生进行诊断,通过检索最新的医学研究、临床试验结果和患者病历,为医生提供治疗建议和决策支持。
-
应用示例:
-
诊断辅助:提供最新的医学研究和临床试验信息,辅助医生诊断和治疗。
-
患者教育:为患者提供详细的疾病信息和治疗建议。
-
-
-
个性化推荐系统
-
场景描述:在推荐系统中,RAG技术可以检索用户的购物历史、浏览行为、个人偏好等数据,生成个性化的产品或服务推荐,提高用户满意度和转化率。
-
应用示例:
-
电商推荐:根据用户的购物历史和浏览行为,生成个性化的产品推荐。
-
内容推荐:为用户提供个性化的新闻、文章和视频推荐。
-
-
三、在线大模型平台RAG技术使用
3.1 阿里百炼平台
访问地址:https://bailian.console.aliyun.com,登录之后,在左侧菜单数据应用那里找到知识索引,即为RAG的可视化操作入口;
3.1.1 创建知识库
如下,点击创建知识库
创建成功之后,可以看到列表中的这条数据
3.1.2 导入文档数据
从列表上点击查看进入到下面的导入页面
导入本地的一个PDF文件或其他类型的文档
选择文件
这里还没有文件,需要先通过数据中心导入一个文件
上传本地的文档
导入完成并确认
导入成功后会展示在列表中
然后再在上面的知识索引中,选择刚刚导入的这个文件
3.1.3 文档数据解析
导入完成之后,这里会对文档按照要求进行解析,从而存储到平台的向量数据库
3.1.4 查看数据
点击查看数据
进来之后,不难发现,导入的文档经过切片之后拆分为一个个片段
基于切分后的文件,就可以输入关键字进行搜索了
3.2 百度文心智能体
访问地址:https://agents.baidu.com/center ,文心智能体平台同属文心大模型系列,只不过文心智能体平台功能更加丰富,有很多新潮的AI能力可供免费体验,如下可以看到,也提供了知识库的能力
点击文档中心,来到下面的页面,在这里详细介绍了该功能的作用和使用场景
话不多说,我们来体验一下该知识库的AI能力
3.2.1 创建知识库
点击左侧我的知识库,初次进入这里空空如也
点击创建一个知识库,顺便在表单里面上传一个本地文件
然后点击下一步,然后再点击默认分段,也可以根据自己的需求进行默认分段
此时可以看到,文档按照一定的规则被分成了很多小的分段
最后点击提交,这篇文档就进入到个人的知识库列表了,等待处理完毕即可
点击查看,进去之后就可以根据自己的需要按照关键字搜索,符合要求的文档片段就会搜索出来
3.3 智谱AI开放平台
https://open.bigmodel.cn/,登录之后,在左侧菜单有一个知识库的菜单,即为RAG的入口,下面来看具体的操作过程
3.3.1 新建知识库
简单填写一下知识库的名称保存即可
3.3.2 上传文档
上一步创建完成之后直接跳转到下面上传知识文档的页面
选择一个你本地的知识文档上传,然后重复上面两个案例中的操作即可。
四、Java对接RAG技术
4.1 向量数据库介绍
RAG技术中很重要的一个点就是要对文档进行切片存储,以供后续文档的检索,这些数据最终存储到哪里呢?答案就是向量数据库。
4.1.1 什么是向量数据库
RAG(Retrieval-Augmented Generation)技术中的向量数据库是专门设计用于存储和检索高维向量数据的系统,这些向量通常是从文本、图像、音频等多媒体数据中提取的特征向量。
在RAG架构中,向量数据库的作用至关重要,因为它提供了检索阶段所需的高效、精确的相似度搜索功能。
4.1.2 向量数据库基本概念
-
向量:向量是多维数组,通常表示数据的特征。在NLP任务中,向量可以是单词、句子或文档的嵌入表示。
-
向量数据库:一种专门设计用于存储和检索高维向量数据的数据库系统,支持高效的相似度搜索。
4.1.3 向量数据库主要功能
向量数据库主要有如下功能:
-
存储向量:向量数据库可以存储大量的高维向量数据,每个向量可以附带元数据,如文档ID、时间戳等。
-
相似度搜索:向量数据库支持高效的相似度搜索,可以快速找到与查询向量最相似的向量。常见的相似度度量方法包括欧氏距离、余弦相似度等。
-
索引优化:为了加速相似度搜索,向量数据库通常使用各种索引技术,如近似最近邻(Approximate Nearest Neighbor, ANN)算法。
4.1.4 向量数据库优势
向量数据库优势主要具有如下优势:
-
高效搜索:向量数据库通过索引优化,能够在大规模数据集中快速找到最相似的向量。
-
灵活扩展:支持水平扩展,能够处理不断增长的数据集。
-
集成方便:可以轻松集成到现有的RAG架构中,提升系统的整体性能。
4.1.5 向量数据库应用场景
向量数据库有很多应用场景,下面列举几种常见的使用场景:
-
推荐系统:通过向量数据库检索用户兴趣相似的物品或内容。
-
问答系统:在开放域问答中,检索相关文档片段以生成更准确的答案。
-
内容生成:结合外部知识库,生成更丰富、详细的内容。
-
图像和视频检索:在多媒体数据中快速找到相似的图像或视频片段。
RAG向量数据库是RAG架构中的重要组成部分,通过高效、精确的相似度搜索功能,显著提升了RAG系统在各种应用场景中的性能和效果。选择合适的向量数据库系统和技术,可以极大地优化RAG系统的整体表现。
4.2 Java对接阿里向量数据库
在阿里云的百炼平台注册账号并获取apikey
在平台的界面上,选择某个类型的向量数据库模型
4.2.1 maven工程中导入核心依赖
导入如下核心依赖
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.35</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<finalName>boot-docker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4.2.2 文本嵌入模型
如何用一段话去数据库查找数据?答案是向量求相似度。因此第一件事需要将句子(文本内容)向量化,然后和向量数据库中的向量进行比较,找到最相似的向量。嵌入模型就可以帮我们做到这件事情。参考下面的代码。
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
public class DocumentController {
private final EmbeddingModel embeddingModel;
@Autowired
public DocumentController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/ai/embedding")
public Map embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
EmbeddingResponse embeddingResponse = this.embeddingModel.embedForResponse(List.of(message));
return Map.of("embedding", embeddingResponse);
}
//localhost:8081/embedding
@GetMapping("/embedding")
public Object embeddingTest() {
// 文本嵌入
float[] embed = embeddingModel.embed("你好,我是小码农叔叔");
log.info("文本转换得到的向量: {}", embed);
return embed;
}
}
测试一下接口:localhost:8081/embedding
4.3 百炼平台通用向量数据库
如下登录阿里云百炼平台,里面提供了不少通用的文本向量模型,以第一个模型为例进行对接使用和演示
4.3.1 使用SDK嵌入文本
选择第一个模型,进入之后可以看到关于该模型的详细介绍和相关的API,以及API的参数等信息
在使用之前,需要先做下面几个准备:
-
获取apikey;
-
引入SDK;
-
确保自己账号余额充足,或者账户中的token数据充足
SDK的依赖如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.16.9</version>
</dependency>
SDK目前支持三种输入,分别是字符串、字符串列表和文件,以文本输入为例,参考下面的示例代码
package com.congge.translate.data;
import java.util.Arrays;
import java.util.concurrent.Semaphore;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.embeddings.TextEmbedding;
import com.alibaba.dashscope.embeddings.TextEmbeddingParam;
import com.alibaba.dashscope.embeddings.TextEmbeddingResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
public class MainTest {
public static void basicCall() throws ApiException, NoApiKeyException{
TextEmbeddingParam param = TextEmbeddingParam
.builder()
.apiKey("你的apikey")
.model(TextEmbedding.Models.TEXT_EMBEDDING_V1)
.texts(Arrays.asList("风急天高猿啸哀", "渚清沙白鸟飞回", "无边落木萧萧下", "不尽长江滚滚来")).build();
TextEmbedding textEmbedding = new TextEmbedding();
TextEmbeddingResult result = textEmbedding.call(param);
System.out.println(result);
}
public static void callWithCallback() throws ApiException, NoApiKeyException, InterruptedException{
TextEmbeddingParam param = TextEmbeddingParam
.builder()
.model(TextEmbedding.Models.TEXT_EMBEDDING_V1)
.texts(Arrays.asList("风急天高猿啸哀", "渚清沙白鸟飞回", "无边落木萧萧下", "不尽长江滚滚来")).build();
TextEmbedding textEmbedding = new TextEmbedding();
Semaphore sem = new Semaphore(0);
textEmbedding.call(param, new ResultCallback<TextEmbeddingResult>() {
@Override
public void onEvent(TextEmbeddingResult message) {
System.out.println(message);
}
@Override
public void onComplete(){
sem.release();
}
@Override
public void onError(Exception err){
System.out.println(err.getMessage());
err.printStackTrace();
sem.release();
}
});
sem.acquire();
}
public static void main(String[] args){
try{
callWithCallback();
}catch(ApiException|NoApiKeyException|InterruptedException e){
e.printStackTrace();
System.out.println(e);
}
try {
basicCall();
} catch (ApiException | NoApiKeyException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
运行上面的代码,通过控制台输出可以看到执行效果
4.3.2 HTTP调用
下面是通过http的方式进行调用的代码
package com.congge.translate.data;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class EmbeddingClient {
public static void main(String[] args) {
try {
// 请求地址
String url = "https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding";
// 你的 API Key
String apiKey = "你的apikey";
// 创建 HttpClient 实例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("Authorization", "Bearer " + apiKey);
httpPost.setHeader("Content-Type", "application/json");
// 设置请求体
String jsonBody = "{\n" +
" \"model\": \"text-embedding-v1\",\n" +
" \"input\": {\n" +
" \"texts\": [\n" +
" \"风急天高猿啸哀\",\n" +
" \"渚清沙白鸟飞回\", \n" +
" \"无边落木萧萧下\", \n" +
" \"不尽长江滚滚来\"\n" +
" ]\n" +
" },\n" +
" \"parameters\": {\n" +
" \"text_type\": \"query\"\n" +
" }\n" +
"}";
StringEntity entity = new StringEntity(jsonBody, "UTF-8");
httpPost.setEntity(entity);
// 发送请求并获取响应
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
// 读取响应内容
String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("Response: " + responseBody);
} finally {
// 关闭响应
response.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行一下程序,可以得到相同的效果
4.4 自建向量数据库Milvus
也可以根据实际需要自建向量数据库,比如像百度的VectorDB, FAISS(Facebook AI Similarity Search)、Milvus、Elasticsearch 的向量插件、Weaviate 等,这些工具可以高效地存储和查询向量数据。下面介绍一款高性能的向量数据库Milvus,可以本地化部署和使用。
4.4.1 获取Docker Compose文件
下载Milvus的docker compose文件,下载地址:https://github.com/milvus-io/milvus/releases/tag/v2.4.6
4.4.2 启动容器
下载yml文件到服务器之后,使用下面的命令运行
docker-compose -f milvus-standalone-docker-compose.yml up -d
等待里面的容器启动完成即可
据官方文档描述,standalone版本主要是三个components,分别是:etcd、minio和standalone,因此compose里面启动的就是这三个服务,等待3个容器的服务都启动成功了,就可以通过ip和端口链接到milvus了。
注意:防火墙开放相关的端口以免服务无法正常访问
4.5 Java代码操作Milvus
下面演示如何在代码中操作Milvus
4.5.1 引入依赖
导入Milvus的Java 相关的SDK,版本最好能匹配
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.4.6</version>
</dependency>
4.5.2 创建集合
类似于Java操作mysql通过jdbc一样,参考下面的代码,创建一个集合
- 集合在这里可以类比理解为mysql中的table
package com.congge.translate.data;
import io.milvus.client.MilvusServiceClient;
import io.milvus.grpc.DataType;
import io.milvus.param.ConnectParam;
import io.milvus.param.R;
import io.milvus.param.collection.CreateCollectionParam;
import io.milvus.param.collection.FieldType;
import io.milvus.param.collection.HasCollectionParam;
public class MilvusTest {
static final MilvusServiceClient MILVUS_CLIENT = new MilvusServiceClient(
ConnectParam.newBuilder()
.withHost("你的IP")
.withPort(19530)
.build()
);
public static void main(String[] args) {
FieldType fieldType1 = FieldType.newBuilder()
.withName("book_id")
.withDataType(DataType.Int64)
.withPrimaryKey(true)
.withAutoID(false)
.build();
FieldType fieldType2 = FieldType.newBuilder()
.withName("word_count")
.withDataType(DataType.Int64)
.build();
FieldType fieldType3 = FieldType.newBuilder()
.withName("book_intro")
.withDataType(DataType.FloatVector)
.withDimension(2)
.build();
CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()
.withCollectionName("book")
.withDescription("Test book search")
.withShardsNum(2)
.addFieldType(fieldType1)
.addFieldType(fieldType2)
.addFieldType(fieldType3)
.withEnableDynamicField(true)
.build();
MILVUS_CLIENT.createCollection(createCollectionReq);
R<Boolean> respHasCollection = MILVUS_CLIENT.hasCollection(
HasCollectionParam.newBuilder()
.withCollectionName("book")
.build()
);
if (respHasCollection.getData() == Boolean.TRUE) {
System.out.println("Collection exists.");
}
}
}
运行上面的代码,可以看到与Milvus成功创建连接并且创建了一个集合
4.5.3 集合插入数据
使用下面的代码向上述创建的集合插入一条数据
private static void insert() {
List<InsertParam.Field> fields = new ArrayList<>();
fields.add(new InsertParam.Field( "book_id", Arrays.asList(11101L) ) );
fields.add(new InsertParam.Field( "word_count", Arrays.asList(100000L) ) );
//插入
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName("book")
//.withPartitionName(partitionName)
.withFields(fields)
.build();
R<MutationResult> insert = MILVUS_CLIENT.insert(insertParam);
Integer status = insert.getStatus();
System.out.println("插入数据的状态 :" + status);
Exception exception = insert.getException();
MutationResult data = insert.getData();
if( data == null ){
System.out.println( exception.getMessage() );
return;
}
List<Long> ids = data.getIDs().getIntId().getDataList();
ids.forEach(item ->{
System.out.println("item : " + item);
});
}
更多的其他方法,有兴趣的同学可以在此基础上进行学习和研究,限于篇幅本篇就不再继续演示了
五、写在文末
本文通过较大的篇幅详细介绍了大模型中的RAG技术,并通过案例演示了如何使用RAG技术中向量数据库,希望对看到的同学有用,本篇到此结束,感谢观看。