Spring AI实现RAG(检索增强生成)详解与实践

Spring AI实现RAG(检索增强生成)详解与实践

一、什么是RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和文本生成的技术。它通过从外部知识库中检索相关信息,然后将这些信息作为上下文提供给生成模型,从而生成更准确、更相关的回答。

RAG的核心原理

  1. 检索(Retrieval):从知识库中检索与查询相关的文档片段
  2. 增强(Augmentation):将检索到的信息作为上下文增强提示
  3. 生成(Generation):基于增强后的提示生成最终回答

RAG的优势

  • 知识更新:无需重新训练模型即可更新知识
  • 准确性:基于实际文档生成,减少幻觉问题
  • 可追溯性:可以追溯到信息来源
  • 成本效益:比微调模型更经济

二、Spring AI中的RAG支持

Spring AI提供了完整的RAG实现框架,包括:

  • 向量存储:支持多种向量数据库
  • 文档加载:支持多种文件格式
  • 文本分割:智能文档分块
  • 向量化:文本向量嵌入
  • 检索:相似度搜索

三、Spring AI实现RAG的步骤

1. 添加依赖

pom.xml中添加Spring AI RAG相关依赖:

<dependencies><!-- Spring AI Core --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>1.0.0</version></dependency><!-- Spring AI OpenAI --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0</version></dependency><!-- Spring AI Vector Store (支持多种向量数据库) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-pgvector-store</artifactId><version>1.0.0</version></dependency><!-- 或者使用其他向量数据库 --><!-- <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-chroma-store</artifactId> <version>1.0.0</version> </dependency> --><!-- 文档处理 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-pdf-document-reader</artifactId><version>1.0.0</version></dependency></dependencies>

2. 配置向量存储和模型

application.yml中配置:

spring:ai:openai:api-key: ${ OPENAI_API_KEY}chat:options:model: gpt-4temperature:0.7vectorstore:pgvector:index-type: HNSW distance-type: COSINE_DISTANCE dimensions:1536

3. 创建向量存储服务

packagecom.example.rag.service;importorg.springframework.ai.document.Document;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassVectorStoreService{ @AutowiredprivateVectorStore vectorStore;/** * 添加文档到向量存储 */publicvoidaddDocuments(List<Document> documents){  vectorStore.add(documents);}/** * 根据查询检索相似文档 */publicList<Document>search(String query,int topK){ return vectorStore.similaritySearch(query, topK);}}

4. 实现RAG服务

packagecom.example.

Read more

C++ 类和对象(二):默认成员函数详解

C++ 类和对象(二):默认成员函数详解

在 C++ 面向对象编程中,类的默认成员函数是非常重要的概念。当我们没有显式实现某些成员函数时,编译器会自动生成它们,这些函数被称为默认成员函数。本文将详细介绍 C++ 类的 6 个默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载以及取地址运算符重载。 一、默认成员函数概述 默认成员函数是指用户没有显式实现,编译器会自动生成的成员函数。一个类在我们不写任何成员函数的情况下,编译器会默认生成以下 6 个默认成员函数:构造函数析构函数拷贝构造函数赋值运算符重载普通取地址运算符重载const 取地址运算符重载         其中前 4 个是我们需要重点掌握的,后两个在大多数情况下使用编译器自动生成的即可。另外,C++11 以后还增加了两个默认成员函数:移动构造和移动赋值,本文暂不讨论。 二、构造函数         构造函数是一种特殊的成员函数,其作用是在对象实例化时初始化对象,替代了我们以前手动调用的Init函数,并且会自动调用。 构造函数的特点:函数名与类名相同无返回值(不需要写void)对象实例化时系统会自动调用对应的构造函数可以重载

By Ne0inhk
【C++:异常】C++ 异常处理完全指南:从理论到实践,深入理解栈展开与最佳实践

【C++:异常】C++ 异常处理完全指南:从理论到实践,深入理解栈展开与最佳实践

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬 艾莉丝的C++专栏简介: 文章目录 * C++学习阶段的三个参考文档 * 1 ~> 异常的概念 * 2 ~> 异常的使用层 * 2.1 异常的抛出和捕获 * 2.2 栈展开 * 2.2.1 理论 * 2.2.2 最佳实践 * 2.3 查找匹配的处理代码 * 2.3.

By Ne0inhk
C++进阶:(十六)从裸指针到智能指针,C++ 内存管理的 “自动驾驶” 进化之路

C++进阶:(十六)从裸指针到智能指针,C++ 内存管理的 “自动驾驶” 进化之路

目录 前言 一、裸指针的 “血泪史”:为什么我们需要智能指针? 1.1 内存泄漏:最常见的 “噩梦” 1.2 二次释放:致命的 “双重打击” 1.3 野指针:潜伏的 “幽灵” 1.4 异常安全:被忽略的 “隐形杀手” 1.5 智能指针的核心使命 二、智能指针的 “三驾马车”:unique_ptr、shared_ptr、weak_ptr 2.1 unique_ptr:独占所有权的 “独行侠” 2.1.1 unique_ptr 的核心原理

By Ne0inhk
C++ 函数指针与回调函数深度解析

C++ 函数指针与回调函数深度解析

第32篇:C++ 函数指针与回调函数深度解析 一、学习目标与重点 * 掌握函数指针的定义、声明、初始化及调用方式 * 理解函数指针的核心应用场景,能够灵活运用函数指针优化代码 * 掌握回调函数的概念、实现原理及注册机制 * 能够独立编写回调函数案例,解决实际开发中的解耦需求 * 理解函数指针与typedef、std::function的结合使用技巧 * 规避函数指针使用中的常见错误(类型不匹配、空指针调用等) 💡 核心重点:函数指针的类型匹配规则、回调函数的注册与执行流程、函数指针与现代C++特性的结合 二、函数指针基础认知 2.1 什么是函数指针 函数指针是指向函数的指针变量,本质是指针,但它存储的不是普通数据的地址,而是函数在内存中的入口地址。通过函数指针,我们可以间接调用函数,实现“以指针方式操作函数”的灵活编程模式。 🗄️ 类比理解: * 普通指针:int* p 指向int类型数据,通过*p访问数据 * 函数指针:int (*p)(int,

By Ne0inhk