1. 简介
前两章我们讲了如何使用LangChain4J
进行AI交互, 其中包括
- 使用
ChatLanguageModel
、ChatMessage
、ChatMemory
等底层组件进行灵活/自由的与AI交互 传送门 - 使用
AI Services
高级对象, 只关注业务逻辑, 使用简单的Api即可进行AI交互 传送门
RAG(Retrieval-Augmented Generation,检索增强生成): 是一种利用向量数据库召回专业知识并融入Prompt的大模型应用方案.
RAG其实分为两个阶段: 构建索引
和 检索
1.1 构建索引
构建索引的过程其实是构建知识库的过程 如上图上半部分, 执行步骤如下:
- 数据准备 (数据形式不限 如 文件, 字符串, 数据表内容 甚至是多媒体类型都可以)
- 读取数据内容并分割成文本块 (数据规模很可能非常庞大,整体存储具有难度,并且在查询的时候可能仅仅和其中的一个或几个段落有关系,所以需要分块处理 将解析后的文档内容切分为适当的片段)
- 将分割的文本块向量化 (转换成机器能识别的内容)
- 将向量化的内容存储进向量数据库
1.2 检索
检索过程其实就是当我们进行提问的时候, 先使用之前准备好的知识库把提问内容相关的知识检索出来,然后一并将问题和检索结果交给大模型,辅助大模型生成回答 如上图下半部分 执行步骤如下:
- 用户提问
- 将用户提问的内容向量化
- 使用
问题向量化的结果
到向量数据库进行检索,并返回相关的知识 - 将问题和相关的知识组织成提示词交给大模型
- 大模型根据提示词思考并生成回答
- 响应用户
1.3 解决了什么问题
RAG核心是为了弥补传统通用大模型的两大短板:
- 知识时效性不足:传统大模型训练数据固定,难以及时获取最新信息(如 近期的新闻、政策),而 RAG 通过实时检索外部知识库,让 AI 能调用最新数据生成回答。
- 专业领域知识受限:通用模型对垂直领域(如医疗、法律)的深度知识掌握有限,RAG 可连接行业专属数据库,提升回答的专业性和准确性。
简言之,RAG 让 AI “边查边答”,解决 “知识旧” 和 “不够专” 的问题,让回答更实时、更精准。
2. 实践案例
本章我们使用LangChain4J
来实现一个简单的RAG需求: 整理一份学生成绩系统的数据库表ddl信息, 通过RAG实现让大模型帮我们生成sql语句, 比如向大模型提问: 张铁牛上学期语文考试成绩是多少? 希望AI给我们响应查询sql语句.
2.1 环境信息
使用SDK版本信息如下:
2.1.1 部署PGVector
推荐使用docker-compose部署, yml文件如下:
2.2 Maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0
</modelVersion>
<parent>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-parent
</artifactId>
<version>3.4.5
</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.ldx
</groupId>
<artifactId>langchain-test
</artifactId>
<version>0.0.1-SNAPSHOT
</version>
<name>langchain-test
</name>
<description>langchain-test
</description>
<properties>
<java.version>21
</java.version>
<guava.version>33.0.0-jre
</guava.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-bom
</artifactId>
<version>1.0.1
</version>
<type>pom
</type>
<scope>import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-open-ai
</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava
</groupId>
<artifactId>guava
</artifactId>
<version>${guava.version}
</version>
</dependency>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-reactor
</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j
</groupId>
<artifactId>langchain4j-pgvector
</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok
</groupId>
<artifactId>lombok
</artifactId>
<optional>true
</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-test
</artifactId>
<scope>test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins
</groupId>
<artifactId>maven-compiler-plugin
</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-maven-plugin
</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok
</groupId>
<artifactId>lombok
</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.3 构建模型和存储对象
private
static ChatModel chatModel;
private
static EmbeddingModel embeddingModel;
private
static EmbeddingStore<TextSegment> embeddingStore;
private
static JdkHttpClientBuilder jdkHttpClientBuilder;
@BeforeAll
public
static
void
init_embed_model
() {
jdkHttpClientBuilder = JdkHttpClient
.builder()
.httpClientBuilder(HttpClient.newBuilder());
chatModel = OpenAiChatModel
.builder()
.httpClientBuilder(jdkHttpClientBuilder)
.apiKey(System.getenv(
"LLM_API_KEY"))
.modelName(
"qwen-plus")
.baseUrl(
"https://dashscope.aliyuncs.com/compatible-mode/v1")
// 打印请求日志
//.logRequests(true)
// 打印响应日志
//.logResponses(true)
.build();
embeddingModel = OpenAiEmbeddingModel
.builder()
.httpClientBuilder(jdkHttpClientBuilder)
.apiKey(System.getenv(
"LLM_API_KEY"))
.modelName(
"text-embedding-v3")
.baseUrl(
"https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
embeddingStore = PgVectorEmbeddingStore
.builder()
.host(
"localhost")
// 必需:PostgresSQL 实例的主机
.port(
5431)
// 必需:PostgresSQL 实例的端口
.database(
"postgres")
// 必需:数据库名称
.user(
"root")
// 必需:数据库用户
.password(
"123456")
// 必需:数据库密码
.table(
"my_sql_embeddings")
// 必需:存储嵌入的表名
.dimension(embeddingModel.dimension())
// 必需:嵌入的维度
.metadataStorageConfig(DefaultMetadataStorageConfig.defaultConfig())
// 元数据存储配置
.build();
}
2.4 测试向量化
测试使用向量模型 将sql信息转为向量数据
测试结果如下:
2.5 测试构建索引
测试结果如下:
2.6 测试检索
AI Services
测试结果如下(开启了请求相应日志) :
3.小结
本章通过使用RAG特性实现一个简单的text-sql功能实现, 直观的感受了一下RAG的强大之处, 下一章我们将使用SpringBoot
实现快速集成LangChain4J
, 通过简单的配置即可实现AI的调用。
4. 源码
测试过程中的代码已全部上传至github, 欢迎点赞收藏 仓库地址: https://github.com/ludangxin/langchain4j-test
student_ddl.sql
__EOF__

本文链接: https://www.cnblogs.com/ludangxin/p/18923413.html
关于博主:评论和私信会在第一时间回复。或者 直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 【推荐】一下。您的鼓励是博主的最大动力!