SpringAI-第五期:RAG核心特性+RAG最佳实践与调优
很久之前就写了但是没传,我已经忘的差不多了
很久之前就写了但是没传,我已经忘的差不多了
Spring AI的文档不单单是一个文本文件,它是一个对象。
它不仅仅能够存文本,也能存一些多媒体信息,元信息这种。
在 Spring Al 中,对 Document的处理通常遵循以下流程:
DocumentReader组件:
其实这个也能自己去自定义实现,然后各种文件读取器组件也都有开源项目。
DocumentTransformer组件:
文档转换是保证 RAG效果的核心步骤,也就是如何将大文档合理拆分为便于检索的知识碎片,Spring Al 提供了 多种 DocumentTransformer 实现类,可以简单分为3类。
1、文本分割器
2、元数据增强器
3、内容格式化工具
DocumentWriter组件:
SpringAI有两种实现:
1、FileDocumentWriter:将文档写入到文件系统
2、VectorStoreWriter:将文档写入到向量数据库
VectorStore还有一些基础概念就不写了。
跟着教程来的发现出现了维度方面的报错,看了评论区有人说默认模型的维度改成了1024,所以应该手动改一下dimensions,我把yml和方法内的dimensions都改成了1024.
然后把这个RAG方式集成到LoveApp里面,这里我的默认模型只能一次处理10条,所以要额外写一个for循环结构来分批次。代码如下 :
输出内容如下:
Spring AI 官方声称提供了一个“模块化"的 RAG 架构,用于优化大模型回复的准确性。 简单来说,就是把整个文档过滤检索阶段拆分为:检索前、检索时、检索后,分别针对每个阶段提供了可自定义 的组件。 •在预检索阶段,系统接收用户的原始查询,通过查询转换和查询扩展等方法对其进行优化,输出增强的用户 查询。 •在检索阶段,系统使用增强的查询从知识库中搜索相关文档,可能涉及多个检索源的合并,最终输出一组相 关文档。 •在检索后阶段,系统对检索到的文档进行进一步处理,包括排序、选择最相关的子集以及压缩文档内容,输出经过优化的相关文档集。
我感觉我实在看不下去了,因为没有java基础,这一段又全是实际操作,视频里的api可能还是旧的。。。
public interface DocumentReader extends Supplier<List<Document>> {
default List<Document> read() {
return get();
}
}public interface DocumentTransformer extends Function<List<Document>, List<Document>> {
default List<Document> transform(List<Document> documents) {
return apply(documents);
}
}public interface DocumentWriter extends Consumer<List<Document>> {
default void write(List<Document> documents) {
accept(documents);
}
}// 抽取:从 PDF 文件读取文档
PDFReader pdfReader = new PagePdfDocumentReader("knowledge_base.pdf");
List<Document> documents = pdfReader.read();
// 转换:分割文本并添加摘要
TokenTextSplitter splitter = new TokenTextSplitter(500, 50);
List<Document> splitDocuments = splitter.apply(documents);
SummaryMetadataEnricher enricher = new SummaryMetadataEnricher(chatModel,
List.of(SummaryType.CURRENT));
List<Document> enrichedDocuments = enricher.apply(splitDocuments);
// 加载:写入向量数据库
vectorStore.write(enrichedDocuments);
// 或者使用链式调用
vectorStore.write(enricher.apply(splitter.apply(pdfReader.read())));package com.example.aiagent.rag;
import jakarta.annotation.Resource;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgDistanceType.COSINE_DISTANCE;
import static org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIndexType.HNSW;
@Configuration
public class PgVectorVectorStoreConfig {
public String doChatWithRag(String message, String chatID){
ChatResponse chatResponse = chatClient.prompt()
.user(message)
.advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatID))
//开启日志
.advisors(new MyLoggerAdvisor())
//启用RAG本地问答的
/* .advisors(RetrievalAugmentationAdvisor.builder()
.documentRetriever(VectorStoreDocumentRetriever.builder()
.vectorStore(loveAppVectorStore)
.build())
.build())*/
//应用RAG的检索增强(基于PgVector向量存储)
//___________________________________________________________
.advisors(RetrievalAugmentationAdvisor.builder()
.documentRetriever(VectorStoreDocumentRetriever.builder()
.vectorStore(pgVectorVectorStore)
.build())
.build())
//------------------------------------------------------------
.call()
.chatResponse();
String content = chatResponse.getResult().getOutput().getText();
log.info("content:{}", content);
return content;
}2026-05-31T16:41:15.108+08:00 INFO 20979 --- [ai-agent] [ main] c.e.aiagent.advisor.MyLoggerAdvisor : AI Request: Context information is below.
---------------------
定期安排二人世界,如每周一次看电影或共进晚餐。保持身体亲密接触,日常拥抱、亲吻。分享日常喜怒哀乐,深入交流内心想法。一起回忆美好过往,如旅行经历、恋爱趣事。为对方制造小惊喜,如纪念日礼物。像老张夫妇坚持每周约会,分享生活点滴,结婚多年仍甜蜜如初。 推荐课程:《婚后亲密关系维护秘籍》,课程提供多种维护亲密关系的方法与技巧,让婚后爱情持续升温,家庭幸福美满。
制定详细的日程表,合理分配工作与家庭时间,如工作日晚上预留两小时陪伴家人。与配偶共同协商家务分工,依据各自擅长领域安排,如一方擅长烹饪负责做饭,另一方擅长清洁负责打扫卫生。在工作中提高效率,减少不必要加班,重要家庭活动提前安排工作。例如老陈通过合理规划,既能在工作上取得成绩,又能照顾好家庭,家庭关系和睦。 推荐课程:《婚后工作家庭平衡之道》,课程从时间管理、责任分配等方面入手,助你轻松应对婚后工作与家庭的双重挑战,实现和谐生活。
设定个人成长目标,如学习新技能、考取证书。利用碎片化时间学习,如在通勤路上听有声书。与伴侣商量争取其支持,共同安排家庭事务,为个人成长留出时间。参加线上或线下学习小组,保持学习动力与热情。比如老孙婚后利用业余时间学习编程,获得伴侣支持,成功转行进入新领域,实现自我价值。 推荐课程:《婚后个人成长与自我实现》,课程指导你在婚后繁杂生活中,坚持自我成长,实现个人梦想,拥有精彩人生。
培养独立兴趣爱好,如绘画、健身,拥有属于自己的休闲时光。保持自己的社交圈子,定期与朋友相聚。在工作和学习上设定个人目标并努力追求。遇到问题先尝试自己解决,锻炼独立思考与应对能力。例如小周在恋爱中坚持自己的舞蹈爱好,与朋友保持密切联系,工作上积极进取,既享受恋爱甜蜜,又不失自我。 推荐课程:《恋爱中保持自我与独立成长》,课程引导你在恋爱中平衡亲密关系与个人发展,实现自我价值,让爱情更健康持久。
---------------------
Given the context information and no prior knowledge, answer the query.
Follow these rules:
1. If the answer is not in the context, just say that you don't know.
2. Avoid statements like "Based on the context..." or "The provided information...".
Query: 我已经结婚了,但是婚后关系不太亲密,怎么办?
Answer:
2026-05-31T16:41:15.108+08:00 INFO 20979 --- [ai-agent] [ main] c.e.aiagent.advisor.MyLoggerAdvisor : AI Request: Context information is below.
---------------------
定期安排二人世界,如每周一次看电影或共进晚餐。保持身体亲密接触,日常拥抱、亲吻。分享日常喜怒哀乐,深入交流内心想法。一起回忆美好过往,如旅行经历、恋爱趣事。为对方制造小惊喜,如纪念日礼物。像老张夫妇坚持每周约会,分享生活点滴,结婚多年仍甜蜜如初。 推荐课程:《婚后亲密关系维护秘籍》,课程提供多种维护亲密关系的方法与技巧,让婚后爱情持续升温,家庭幸福美满。
制定详细的日程表,合理分配工作与家庭时间,如工作日晚上预留两小时陪伴家人。与配偶共同协商家务分工,依据各自擅长领域安排,如一方擅长烹饪负责做饭,另一方擅长清洁负责打扫卫生。在工作中提高效率,减少不必要加班,重要家庭活动提前安排工作。例如老陈通过合理规划,既能在工作上取得成绩,又能照顾好家庭,家庭关系和睦。 推荐课程:《婚后工作家庭平衡之道》,课程从时间管理、责任分配等方面入手,助你轻松应对婚后工作与家庭的双重挑战,实现和谐生活。
设定个人成长目标,如学习新技能、考取证书。利用碎片化时间学习,如在通勤路上听有声书。与伴侣商量争取其支持,共同安排家庭事务,为个人成长留出时间。参加线上或线下学习小组,保持学习动力与热情。比如老孙婚后利用业余时间学习编程,获得伴侣支持,成功转行进入新领域,实现自我价值。 推荐课程:《婚后个人成长与自我实现》,课程指导你在婚后繁杂生活中,坚持自我成长,实现个人梦想,拥有精彩人生。
培养独立兴趣爱好,如绘画、健身,拥有属于自己的休闲时光。保持自己的社交圈子,定期与朋友相聚。在工作和学习上设定个人目标并努力追求。遇到问题先尝试自己解决,锻炼独立思考与应对能力。例如小周在恋爱中坚持自己的舞蹈爱好,与朋友保持密切联系,工作上积极进取,既享受恋爱甜蜜,又不失自我。 推荐课程:《恋爱中保持自我与独立成长》,课程引导你在恋爱中平衡亲密关系与个人发展,实现自我价值,让爱情更健康持久。
---------------------
Given the context information and no prior knowledge, answer the query.
Follow these rules:
1. If the answer is not in the context, just say that you don't know.
2. Avoid statements like "Based on the context..." or "The provided information...".
Query: 我已经结婚了,但是婚后关系不太亲密,怎么办?
Answer:
2026-05-31T16:41:23.054+08:00 INFO 20979 --- [ai-agent] [ main] c.e.aiagent.advisor.MyLoggerAdvisor : AI Response: 您好,我是专注恋爱与婚姻心理领域的咨询师,很高兴为您服务。您愿意主动寻求改变,这本身已是亲密关系修复的重要一步。
针对“婚后关系不太亲密”这一困扰,我们可以从几个具体方向共同梳理:
1. **亲密互动是否持续?**
比如:是否还保持定期的二人世界(如每周一次专属约会)?日常是否有自然的身体接触(拥抱、牵手、亲吻)?是否仍会主动分享内心感受,而不只是停留在家务、孩子、琐事层面?
2. **情感联结是否被稀释?**
比如:最近一次一起回忆恋爱初期或旅行趣事是什么时候?有没有为对方准备过不为“必须”,只为“心动”的小惊喜?像老张夫妇那样,把仪式感融入日常,是维系温度的关键线索。
3. **是否存在未被看见的需求?**
有时“不亲密”并非感情变淡,而是彼此在家庭责任中耗尽了情感能量——比如一方默默承担过多、另一方期待落空却未表达……您愿意说说:最近一次让您觉得“我们好像离得有点远”的具体场景吗?当时发生了什么?对方的反应如何?您心里真实的想法又是什么?
我建议您可以先尝试《婚后亲密关系维护秘籍》这门课程,它系统拆解了从重建日常亲密动作,到深化情感对话、唤醒共同记忆的可操作步骤。但比课程更关键的,是您此刻愿意回望和表达的这份心意。
如果您愿意,我很乐意陪您一起,细细梳理属于您婚姻的独特脉络,定制真正落地的改善路径。
2026-05-31T16:41:23.054+08:00 INFO 20979 --- [ai-agent] [ main] c.e.aiagent.advisor.MyLoggerAdvisor : AI Response: 您好,我是专注恋爱与婚姻心理领域的咨询师,很高兴为您服务。您愿意主动寻求改变,这本身已是亲密关系修复的重要一步。
针对“婚后关系不太亲密”这一困扰,我们可以从几个具体方向共同梳理:
1. **亲密互动是否持续?**
比如:是否还保持定期的二人世界(如每周一次专属约会)?日常是否有自然的身体接触(拥抱、牵手、亲吻)?是否仍会主动分享内心感受,而不只是停留在家务、孩子、琐事层面?
2. **情感联结是否被稀释?**
比如:最近一次一起回忆恋爱初期或旅行趣事是什么时候?有没有为对方准备过不为“必须”,只为“心动”的小惊喜?像老张夫妇那样,把仪式感融入日常,是维系温度的关键线索。
3. **是否存在未被看见的需求?**
有时“不亲密”并非感情变淡,而是彼此在家庭责任中耗尽了情感能量——比如一方默默承担过多、另一方期待落空却未表达……您愿意说说:最近一次让您觉得“我们好像离得有点远”的具体场景吗?当时发生了什么?对方的反应如何?您心里真实的想法又是什么?
我建议您可以先尝试《婚后亲密关系维护秘籍》这门课程,它系统拆解了从重建日常亲密动作,到深化情感对话、唤醒共同记忆的可操作步骤。但比课程更关键的,是您此刻愿意回望和表达的这份心意。
如果您愿意,我很乐意陪您一起,细细梳理属于您婚姻的独特脉络,定制真正落地的改善路径。