【大模型】大模型RAG检索增强生成技术使用详解

news2024/11/21 15:11:30

目录

一、前言

二、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的工作流程可以分为下面几个步骤:

  1. 文档切片/分块

    1. 在企业级应用场景中,文档尺寸可能非常大,因此需要将长篇文档分割成多个文本块,以便更高效地处理和检索信息。分块的方式有很多种,比如按段落、按内容或者其他特殊结构。同时,需要注意分块的尺寸,如果分块太小,虽然查询更精准,但召回时间更长;如果分块太大,则会影响查询精准度。

  2. 嵌入模型

    1. 嵌入模型的核心任务是将文本转换为向量形式,这样我们就能通过简单的计算向量之间的差异性,来识别语义上相似的句子。

  3. 存入向量数据库

    1. 将文档切片和嵌入模型的结果存储进入向量数据库。向量数据库主要优势在于,它能够根据数据的向量接近度或相似度,快速、精确地定位和检索数据,实现很多传统数据库无法实现的功能,比如根据旋律和节奏搜索出特定的歌曲、在电影中搜索浪漫的片段、在文档中找出意图相近的段落等等。

  4. 用户查询检索

    1. 用户的问题会被输入到嵌入模型中进行向量化处理,然后系统会在向量数据库中搜索与该问题向量语义上相似的知识文本或历史对话记录并返回,这就是检索增强。

  5. 生成问答

    1. 最终将用户提问和上一步中检索到的信息结合,构建出一个提示模版,输入到大语言模型中,由大模型生成最终的结果并返回。

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技术中向量数据库,希望对看到的同学有用,本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;与搜索引擎优化&#xff08;SEO&#xff09;的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作&#xff0c;它直接影响到网站的可见性和流量。通过运用智能算法&#xff0c;企业能…

【WRF-Urban】WRF 4.3版本中城市模块更新总结

【WRF-Urban】WRF 4.3版本中城市模块更新总结 WRF 4.3 版本中城市模块更新1. 局地气候区&#xff08;LCZ&#xff09;的引入WRF 查找表的修改&#xff1a;如何启用 11 类 LCZ 分类&#xff1a; 2. 屋顶缓解策略与建筑材料渗透性3. 新的建筑物阻力系数处理 使用LCZ的WRF-Urban模…

【Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon &#xff08;表&#xff09;过期数据可以释放存储空间&#xff0c;优化资源利用并提升系统运行效…

第二十周:机器学习

目录 摘要 ABSTRACT 一、吴恩达机器学习exp2——逻辑回归 1、logistic函数 2、数据预处理 3、损失函数 4、梯度下降 5、设定评价指标 6、决策边界 7、正则化 二、动手深度学习pytorch——数据预处理 1、数据集读取 2、缺失值处理 3、转换为张量格式 总结 摘要…

反转链表、链表内指定区间反转

反转链表 给定一个单链表的头结点pHead&#xff08;该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1&#xff09;&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 如当输入链表{1,2,3}时&#xff0c;经反转后&#xff0c;原链表变…

VScode学习前端-01

小问题合集&#xff1a; vscode按&#xff01;有时候没反应&#xff0c;有时候出来&#xff0c;是因为------>必须在英文状态下输入&#xff01; 把鼠标放在函数、变量等上面&#xff0c;会自动弹出提示&#xff0c;但挡住视线&#xff0c;有点不习惯。 打开file->pre…

【AI图像生成网站Golang】JWT认证与令牌桶算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 三、JWT认证与令牌桶算法 在现代后端开发中&#xff0c;用户认证和接口限流是确保系统安全性和性能的两大关键要素…

基于Kafka2.1解读Consumer原理

文章目录 概要整体架构流程技术名词解释技术细节coordinatorfetcherclientconsumer#poll的主要流程 全局总览小结 概要 继上一篇讲Producer原理的文章过去已经一个多月了&#xff0c;今天来讲讲Consumer的原理。 其实源码早就读了部分了&#xff0c;但是最近工作比较忙&#x…

测试使用vite搭建的uni-app打包app区分开发环境和生产环境

用脚手架搭建的uniapp项目&#xff0c;打包H5和小程序可以和web端一样&#xff0c;能够通过env.dev和env.prod区分开发环境和生产环境&#xff0c;但是不知道打包成app时如何区分开发环境和生产环境&#xff0c;在此做一个测试记录。 打开package.json文件&#xff0c;在scrip…

【提效工具开发】管理Python脚本执行系统实现页面展示

Python脚本执行&#xff1a;工具管理Python脚本执行系统 背景 在现代的软件开发和测试过程中&#xff0c;自动化工具和脚本的管理变得至关重要。为了更高效地管理工具、关联文件、提取执行参数并支持动态执行Python代码&#xff0c;我们设计并实现了一套基于Django框架的工具…

Qt-常用的显示类控件

QLabel QLabel有如下核心属性&#xff1a; 关于文本格式的验证&#xff1a; 其中<b>xxx<b>&#xff0c;就是加粗的意思。 效果&#xff1a; 或者再把它改为markdown形式的&#xff1a; 在markd中&#xff0c;#就是表示一级标题&#xff0c;我们在加上##后&#x…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会(RISC-V Summit China 2024)于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构,约3000人线下参与,并在19日至25日间举办了超过20场同期活动,与全球开发者共同…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复&#xff1f; 所谓索引分片的恢复指的是在某些条件下&#xff0c;索引分片丢失&#xff0c;ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些&#xff1f; 分片的分配 当集群中节点的数量发生变化&#xff0c;或者配…

典型的 SOME/IP 多绑定用例总结

SOME/IP 部署中 AP SWC 不自行打开套接字连接的原因 在典型的 SOME/IP 网络协议部署场景里&#xff0c;AP SWC 不太可能自己打开套接字连接与远程服务通信&#xff0c;因为 SOME/IP 被设计为尽可能少用端口。这一需求源于低功耗 / 低资源的嵌入式 ECU&#xff0c;并行管理大量…

MySQL查询执行(八):Memory引擎

思考&#xff1a;两个group by语句都用了order bynull&#xff0c; 为什么使用内存临时表得到的语句结果里&#xff0c; 0这个值在最后一行&#xff1b; 而使用磁盘临时表得到的结果里&#xff0c; 0这个值在第一行&#xff1f; 答&#xff1a;答案对应第一小节&#xff1a;内…

canva 画图 UI 设计

起因&#xff0c; 目的: 来源: 客户需求。 目的&#xff1a; 用数据讲故事。 数据可以瞎编&#xff0c;图表一定要漂亮。 文件分享地址 读者可以在此文件的基础上&#xff0c;继续编辑。 效果图 过程: 我还是喜欢 canva. figma&#xff0c; 我用的时候&#xff0c;每每都想…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考&#xff0c;对ES的分词进行考查&#xff0c;前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

论文精读: PRB LiVSe2 Zigzag链序实验与理论计算

DOI: 10.1103/PhysRevB.108.094107 摘要节选 在具有轨道自由度的过渡金属化合物中&#xff0c;组成元素在低温下自组装形成分子的现象普遍存在。 在本研究中从实验和理论两方面讨论了钒二维三角形晶格层状LiVX2 &#xff08;X O&#xff0c; S, Se&#xff09;体系中出现的三…

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…

【蓝桥杯备赛】123(前缀和的复杂应用)

5. 前缀和的复杂应用 5.1. 123&#xff08;4 星&#xff09; 5.1.1. 题目解析 这道题仍然是求一段区间的和&#xff0c;很容易能够想到前缀和找规律&#xff1a; 1------------------1 号块 1 2----------------2 号块 1 2 3--------------3 号块 1 2 3 4------------4 号…