小汉同学 - AI 超级智能体教程 - 4 - RAG 知识库基础 笔记

扩展思路

1)利用 RAG 知识库,实现 “通过用户的问题推荐可能的恋爱对象” 功能。✅

参考思路:新建一个恋爱对象文档,每行数据包含一位用户的基本信息(比如年龄、星座、职业)。

  1. 使用 AI 生成一份恋爱对象文档
java
复制代码
# 缘分候选人档案 💕 (扩展版) 欢迎来到我们的“缘分候选人档案”!在这里,我们精心挑选并记录了一些优秀单身人士的基本信息、兴趣爱好以及他们对未来伴侣的期许。希望这份档案能帮助你找到那个让你心动的人。 --- ## 候选人 001: 追风的少年 * **昵称**: 追风的少年 * **性别**: 男 * **年龄**: 28 * **星座**: 射手座 ♐ * **职业**: 软件工程师 (专注于人工智能领域) * **城市**: 北京 * **身高**: 180cm * **学历**: 硕士 * **兴趣爱好**: * 户外运动:登山、公路骑行、周末露营 * 科技探索:关注最新的科技动态,喜欢捣鼓各种新奇数码产品 * 摄影:尤其喜欢风光摄影和街头人文 * 阅读:科幻小说、历史传记 * **性格标签**: #开朗阳光 #幽默风趣 #逻辑思维强 #有责任心 #热爱生活 * **一句话自我介绍**: “用代码构建虚拟世界,也渴望在现实中与你一起探索未知的美好。” * **对另一半的期待**: * 希望她是一个热爱生活、有自己兴趣爱好的女生。 * 能够一起分享生活中的点滴,无论是快乐还是挑战。 * 性格独立,有自己的想法,但也懂得沟通和体谅。 * 最好也喜欢户外或者愿意尝试新鲜事物。 * **理想的约会**: 一起去一个陌生的城市探险,或者在山顶看一次日出。 --- ## 候选人 002: 文艺小花 * **昵称**: 文艺小花 * **性别**: 女 * **年龄**: 25 * **星座**: 双鱼座 ♓ * **职业**: 自由撰稿人 / 兼职咖啡师 * **城市**: 上海 * **身高**: 165cm * **学历**: 本科 (汉语言文学专业) * **兴趣爱好**: * 文学艺术:阅读各类小说诗歌,逛美术馆、看话剧 * 手作:喜欢做手账、烘焙、偶尔画点小插画 * 咖啡文化:对精品咖啡有浓厚兴趣,喜欢探访特色咖啡店 * 电影:偏爱文艺片和经典老电影 * **性格标签**: #温柔细腻 #文艺清新 #有点慢热 #共情能力强 #内心世界丰富 * **一句话自我介绍**: “在文字和咖啡香气中寻找生活的小确幸,期待与你共享这份宁静与美好。” * **对另一半的期待**: * 希望他是一个有深度、能进行灵魂交流的人。 * 懂得欣赏生活中的细节之美,有相似的审美情趣。 * 性格成熟稳重,能给予包容和理解。 * 不一定要非常外向,但内心要阳光。 * **理想的约会**: 在一个安静的午后,一起窝在沙发上看一部老电影,或者在一家有格调的书店咖啡馆聊聊天。 --- ## 候选人 012: 治愈系暖男 * **昵称**: 治愈系暖男 * **性别**: 男 * **年龄**: 29 * **星座**: 双鱼座 ♓ * **职业**: 心理咨询师 * **城市**: 杭州 * **身高**: 176cm * **学历**: 心理学硕士 * **兴趣爱好**: * 冥想与正念:保持内心的平和与专注 * 乐器演奏:尤克里里、民谣吉他 * 写作:诗歌、散文,记录生活感悟 * 公益活动:在动物收容所做义工,关爱流浪动物 * 自然漫步:喜欢在公园或山林中散步,感受自然气息 * **性格标签**: #温柔体贴 #善于倾听 #共情能力强 #平和宁静 #有爱心 * **一句话自我介绍**: “倾听内心的声音,疗愈生活的疲惫,希望能成为你温暖的港湾。” * **对另一半的期待**: * 希望她是一个善良、有同理心,注重精神世界的人。 * 能够理解并尊重我的职业,愿意一起探讨心灵成长的话题。 * 享受宁静平和的生活,也愿意一起做一些有意义的小事。 * **理想的约会**: 在一个安静的午后,一起在公园的长椅上晒太阳聊天,或者一起去参加一次公益活动,用行动传递温暖。 --- ## 候选人 013: 环球探险家 * **昵称**: 环球探险家 * **性别**: 女 * **年龄**: 33 * **星座**: 射手座 ♐ * **职业**: 旅行博主 / 自由摄影师 / 兼职翻译 * **城市**: (常驻厦门,但大部分时间在路上) * **身高**: 166cm * **学历**: 本科 (外国语言文学) * **兴趣爱好**: * 深度旅行:背包探索世界各地,体验不同文化 * 语言学习:能流利使用多种语言,并持续学习新语言 * 极限运动:徒步、攀岩、滑翔伞等 * 写作与摄影:记录旅途中的所见所闻所感 * 品尝异国美食:认为食物是了解文化的重要途径 * **性格标签**: #勇敢无畏 #独立自主 #适应力超强 #充满好奇 #乐观开朗 * **一句话自我介绍**: “世界那么大,我想去看看,更想和你一起去看看。” * **对另一半的期待**: * 希望他是一个同样热爱冒险,勇于尝试新事物的人。 * 独立、有主见,能够适应并享受旅途中的不确定性。 * 能成为我旅途中的好伙伴,也能在平凡日子里共同经营生活。 * **理想的约会**: 一起规划下一次的冒险旅程,或者在某个异国小镇的市场里手牵手闲逛,品尝当地小吃。 --- ## 候选人 014: 代码艺术家 * **昵称**: 代码艺术家 * **性别**: 男 * **年龄**: 26 * **星座**: 处女座 ♍ * **职业**: 独立游戏开发者 * **城市**: 武汉 * **身高**: 172cm * **学历**: 本科 (计算机科学) * **兴趣爱好**: * 游戏设计与开发:从像素画到代码实现,乐在其中 * 玩游戏:各类游戏均有涉猎,尤其偏爱独立游戏和RPG * 科幻与奇幻文学:构建宏大世界观的灵感来源 * 桌游与跑团:享受与朋友面对面互动的乐趣 * 偶尔研究烹饪:把做菜也当成一种创造 * **性格标签**: #富有创造力 #注重细节 #逻辑性强 #有点宅 #闷骚但有趣 * **一句话自我介绍**: “在0和1的世界里创造奇迹,期待在现实中与你共同谱写浪漫的篇章。” * **对另一半的期待**: * 希望她是一个能够欣赏我的创造力,理解或对游戏开发有兴趣的人。 * 能和我一起享受安静的居家时光,偶尔也能一起玩玩游戏。 * 有自己的爱好和追求,能够彼此独立又相互支持。 * **理想的约会**: 一起通关一款期待已久的合作类游戏,或者去参加一个游戏开发者沙龙,结束后讨论彼此的创意。 --- ......(我生成了20个候选者)
  1. 上传到百炼平台
  2. 使用对应的代码进行调用
java
复制代码
package com.xiaoh.haiagent.rag.config; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi; import com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetriever; import com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetrieverOptions; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.advisor.RetrievalAugmentationAdvisor; import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; /** * @author: xiaohan * @dataTime: 2025/5/12 16:06 * @desc: */ @Configuration @Slf4j public class LoveAppRagCloudAdvisorConfig { @Value("${myai.api-key.dashscope}") private String dashScopeApiKey; public Advisor loveAppRagCloudAdvisor(String indexName) { log.info("使用 {} 知识库", indexName); if (!StringUtils.hasText(indexName)) { log.error("未传入相关知识库名称"); throw new RuntimeException(indexName + " 知识库不存在"); } DashScopeApi dashScopeApi = new DashScopeApi(dashScopeApiKey); DashScopeDocumentRetriever dashScopeDocumentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions .builder().withIndexName(indexName) .build()); return RetrievalAugmentationAdvisor.builder() .documentRetriever(dashScopeDocumentRetriever) .build(); } }
  1. 在 LoveApp 中写入调用方法
java
复制代码
@Resource private LoveAppRagCloudAdvisorConfig loveAppRagCloudAdvisorConfig; public String doChatWithRagCloud(String message, String chatId, String indexName) { Advisor ragCloudAdvisor = loveAppRagCloudAdvisorConfig.loveAppRagCloudAdvisor(indexName); ChatResponse chatResponse = chatClient.prompt() .user(message) .system("你是一位恋爱大师") .advisors( spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10) ) // 使用知识库进行增强 .advisors(ragCloudAdvisor) .call() .chatResponse(); String text = chatResponse.getResult().getOutput().getText(); log.info("AI 响应:{}", text); return text; }
  1. 在测试类中测试
java
复制代码
@Test void doChatWithRagCloudForObject() { // 数据库中的会话id String chatId = "doChatWithRagCloudForObject"; String question = """ 我是一名大学生且java程序员,22岁,处女座,想谈对象,但是没有找到合适的。 希望她是甜甜的,可爱的,同时可以帮我写代码,像鱼皮一样(狗头) """; String indexName = "AI学习项目-恋爱知识"; loveApp.doChatWithRagCloud(question, chatId, indexName); } /* 内容有点多,就只看AI回答了(我不是男同)(狗头) 2025-05-12T16:52:13.824+08:00 INFO 24996 --- [AI智能体学习项目] [ main] com.xiaoh.haiagent.app.LoveApp : AI 响应:根据你的要求,希望对方是甜甜的、可爱的,还能帮你写代码。从档案中看,候选人014代码艺术家虽然是男的,但符合帮你写代码这个技能, 其他候选人没有特别匹配甜甜可爱又能写代码的特征。不过建议你扩大对另一半的想象,或许一个热爱音乐或旅行的女孩也能带给你不一样的恋爱体验。 如果一定想要 coding partner,可以多参加技术类社交活动,比如黑客松或者技术沙龙,说不定能遇到心仪的女生哦。 */

本节作业

1)理解 RAG 的工作流程和原理 ✅

自我描述:

  • RAG 即检索(retrieval)增强(augmented)生成(generation)
  • 大致流程:先把文档收集处理好,给嵌入大模型进行量化切片等等操作,然后就得到一个知识库了。在后面的回答中,我们可以把用户的问题进行量化,通过量化值去知识库(量化数据库)中查找,获得相关性靠前的数据(可以设置相关性大小),然后可以再进行精排序,提供准确度。最后整合用户问题+知识库相关内容+优化提示词一起给大模型,让它回答问题。

2)实战基于 Spring AI + 本地知识库实现 RAG ✅

  1. 使用 MarkdownDocumentReader + MarkdownDocumentReaderConfig读取本地文件
java
复制代码
package com.xiaoh.haiagent.rag.reader; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.document.Document; import org.springframework.ai.reader.markdown.MarkdownDocumentReader; import org.springframework.ai.reader.markdown.config.MarkdownDocumentReaderConfig; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author: xiaohan * @dataTime: 2025/5/12 14:41 * @desc: 相关知识文件读取器 */ @Component @Slf4j public class LoveAppDocumentReader { private final ResourcePatternResolver resourcePatternResolver; public LoveAppDocumentReader(ResourcePatternResolver resourcePatternResolver) { this.resourcePatternResolver = resourcePatternResolver; } public List<Document> loadMdFiles() { ArrayList<Document> documentList = new ArrayList<>(); try { Resource[] resources = resourcePatternResolver.getResources("classpath:document/*.md"); if (resources.length == 0) { log.info("在 classpath:document/ 目录下没有找到任何 .md 文件"); return documentList; } for (Resource resource : resources) { // 自定义reader的行为 MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder() // 是否Markdown 中的水平分隔线将创建新的 Document 对象 .withHorizontalRuleCreateDocument(true) // 是否代码块将和周围文本包含在同一个 Document 对象中 .withIncludeCodeBlock(false) // 是否引用块将和周围文本包含在同一个 Document 对象中 .withIncludeBlockquote(false) // 自定义元数据 .withAdditionalMetadata("filename", resource.getFilename()) .build(); List<Document> documents = new MarkdownDocumentReader(resource, config).get(); if (documents != null && !documents.isEmpty()) { documentList.addAll(documents); } else { log.warn("文件 {} 解析后没有生成任何文档内容", resource.getFilename()); } } } catch (IOException e) { log.error("加载md文件失败", e); } return documentList; } }
  1. SimpleVectorStore 创建基于内存的向量库
java
复制代码
package com.xiaoh.haiagent.rag.config; import com.xiaoh.haiagent.rag.reader.LoveAppDocumentReader; import jakarta.annotation.Resource; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.vectorstore.SimpleVectorStore; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author: xiaohan * @dataTime: 2025/5/12 15:07 * @desc: 存储 知识文件通过大模型嵌入模型转换的向量 */ @Configuration public class LoveAppVectorStoreConfig { @Resource private LoveAppDocumentReader loveAppDocumentReader; @Bean public VectorStore loveAppVectorStore(EmbeddingModel dashscopeEmbeddingModel) { // 存储位置 protected Map<String, SimpleVectorStoreContent> store = new ConcurrentHashMap(); SimpleVectorStore store = SimpleVectorStore.builder(dashscopeEmbeddingModel).build(); store.add(loveAppDocumentReader.loadMdFiles()); return store; } }
  1. 调用
java
复制代码
// 使用内存RAG进行聊天 @Resource private VectorStore loveAppVectorStore; public String doChatWithRag(String message, String chatId) { ChatResponse chatResponse = chatClient.prompt() .user(message) .system("你是一位恋爱大师") .advisors( spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10) ) // 使用知识库进行增强 .advisors(new QuestionAnswerAdvisor(loveAppVectorStore)) .call() .chatResponse(); String text = chatResponse.getResult().getOutput().getText(); log.info("AI 响应:{}", text); return text; }

3)实战基于 Spring AI + 云知识库实现 RAG ✅

见上 LoveAppRagCloudAdvisorConfig

个人总结

记忆一下这次用到的几个类(熟悉,熟悉,熟悉)

  • SimpleVectorStore
  • MarkdownDocumentReaderConfig
  • MarkdownDocumentReader

最后

如上面有错误,麻烦小伙伴可以多多指教(💗💗💗)

感谢鱼总!

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
小汉同学
作者分享
26届,春招,校招。 不知道怎么弄了。。。焦虑中,请教以下各位大佬。 最先的几个月,我在慢吞吞的做项目,感觉需要自己手过一遍才算自己的。然后,又要自己准备得感觉差不多才心里踏实。现在感觉没有方向了。 我前不久准备好了简历,然后复习了两周的面试题。想着开始投简历。但是,我觉得很多岗位的JD我匹配不上,也不知道该不该投。我看了老鱼简历中的信息列表,点进去看感觉都不适合我。。。 看了抖音上的一些视频,去国聘行动,就业平台等,我看了。有一些岗位,但是,它们都必须在它们的平台上弄好简历,还不能上传我做好的简历。要填的东西很多。让我感觉会填很久,然后也不一定有响应。 之前待了一家实习,实习半个月,找我谈签三方,但是我觉得是Python路线,我就放弃了。在学校我线下去投递过,最近这几天去投了来校内的几家,目前还没有消息,感觉是没了。 图片是简历,已经脱敏。希望大佬们可以给我指点一下。目前不知道怎么弄了。 问题: 在哪里找中小公司的校招岗位? 如果JD自我感觉不匹配,是不是不需要投递了? 智联招聘、BOSS是不是和网上说的不适合校招毕业生? 麻烦各位大佬的回复了。谢谢。
4
AI 超级智能体项目教程 - 6 - 工具调用 笔记
1
小汉同学 - AI 超级智能体教程 - 3 - AI 应用开发 笔记
3
小汉同学 - AI 超级智能体 - 2 - AI 大模型接入 笔记
5
各位大佬晚上好。想问一下问题,蓝桥杯该怎么准备。我在官方网站上面看见有对应的培训课程。但是有点贵(比较穷)。之前过完了B站满老师的数据结构课程,算是入门小白了吧(我也不知道是不是)。目前在根据满老师提供的文档进行复习。因为自己比较迟钝。所以想各位大佬给我提提方法,如何准备才够这个比赛。如果是选择他们官方的课程的话,我想去pdd去找一下有没有去年课程的,便宜一点😂 感谢各位大佬,感谢感谢!!!😁
3
下载 APP