Ai媒婆(丘比特)

Ai媒婆(丘比特)

ai智能体 - 实现Ai媒婆(丘比特)功能-第4期扩展

仓库:lihuibear/ai-agent

本地知识库(md文档)实现

文档内容

markdown
复制代码
**姓名**:林悦,**年龄**:25岁,**性别**:女,**星座**:白羊座,**职业**:平面设计师,**爱好**:绘画、摄影,**择偶期望**:希望对方幽默风趣,有上进心,热爱生活。 **姓名**:陈宇轩,**年龄**:28岁,**性别**:男,**星座**:狮子座,**职业**:程序员,**爱好**:打篮球、玩游戏,**择偶期望**:找一个温柔体贴,善解人意,能理解自己工作的女生。 **姓名**:苏瑶,**年龄**:30岁,**性别**:女,**星座**:天秤座,**职业**:教师,**爱好**:阅读、旅行,**择偶期望**:希望另一半成熟稳重,有责任心,有共同的兴趣爱好。 **姓名**:郑泽阳,**年龄**:23岁,**性别**:男,**星座**:双子座,**职业**:市场营销专员,**爱好**:唱歌、跳舞,**择偶期望**:想找一个活泼开朗,有活力,喜欢社交的女生。 **姓名**:李婉清,**年龄**:27岁,**性别**:女,**星座**:天蝎座,**职业**:护士,**爱好**:瑜伽、烹饪,**择偶期望**:希望对方身体健康,有爱心,能支持自己的工作。 **姓名**:赵启铭,**年龄**:32岁,**性别**:男,**星座**:摩羯座,**职业**:企业高管,**爱好**:健身、高尔夫,**择偶期望**:想找一个优雅大方,有内涵,能在事业上互相支持的女生。 **姓名**:周雨薇,**年龄**:26岁,**性别**:女,**星座**:射手座,**职业**:自由撰稿人,**爱好**:写作、看电影,**择偶期望**:希望另一半思想开放,有创造力,热爱文学艺术。 **姓名**:吴俊辉,**年龄**:29岁,**性别**:男,**星座**:水瓶座,**职业**:工程师,**爱好**:户外运动、摄影,**择偶期望**:找一个乐观积极,热爱大自然,能一起探索世界的女生。 **姓名**:孙晓萱,**年龄**:24岁,**性别**:女,**星座**:处女座,**职业**:行政助理,**爱好**:手工制作、听音乐,**择偶期望**:希望对方细心耐心,有良好的生活习惯,对感情专一。

关键代码

LoveAppDocumentToAiCupidLoader

java
复制代码
package com.lihui.aiagent.rag; 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; @Component @Slf4j class LoveAppDocumentToAiCupidLoader { private final ResourcePatternResolver resourcePatternResolver; LoveAppDocumentToAiCupidLoader(ResourcePatternResolver resourcePatternResolver) { this.resourcePatternResolver = resourcePatternResolver; } /** * 加载 Markdown 文档 * @return */ public List<Document> loadMarkdowns() { List<Document> allDocuments = new ArrayList<>(); try { // 修改为具体的文件路径 Resource[] resources = resourcePatternResolver.getResources("classpath:document/用户资料.md"); for (Resource resource : resources) { String fileName = resource.getFilename(); MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder() .withHorizontalRuleCreateDocument(true) .withIncludeCodeBlock(false) .withIncludeBlockquote(false) .withAdditionalMetadata("filename", fileName) .build(); MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config); allDocuments.addAll(reader.get()); } } catch (IOException e) { log.error("用户资料 Markdown 文档加载失败", e); } return allDocuments; } }

LoveAppVectorStoreConfig

java
复制代码
package com.lihui.aiagent.rag; import jakarta.annotation.Resource; import org.springframework.ai.document.Document; 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; import java.util.List; @Configuration public class LoveAppVectorStoreConfig { @Resource private LoveAppDocumentLoader loveAppDocumentLoader; @Resource private LoveAppDocumentToAiCupidLoader loveAppDocumentToAiCupidLoader; @Bean VectorStore loveAppVectorStore(EmbeddingModel dashscopeEmbeddingModel) { SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel) .build(); // 加载文档 List<Document> documents = loveAppDocumentLoader.loadMarkdowns(); simpleVectorStore.add(documents); return simpleVectorStore; } @Bean VectorStore loveAppToAiCupidVectorStore(EmbeddingModel dashscopeEmbeddingModel) { SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel) .build(); // 加载文档 List<Document> documents = loveAppDocumentToAiCupidLoader.loadMarkdowns(); simpleVectorStore.add(documents); return simpleVectorStore; } }

LoveApp

java
复制代码
// AI媒婆(本地知识库实现) @Resource private VectorStore loveAppToAiCupidVectorStore; public String doChatWithRagToAiCupid(String message, String chatId) { ChatResponse chatResponse = chatClient .prompt() .user(message) .system(SYSTEM_PROMPT + "对话完成后,请以列表形式提供与用户性别相异且匹配的资料,列表中的每个条目应包含姓名、年龄、爱好等基本信息。如果没有匹配的资料,请明确说明 '未找到匹配资料'。") .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)) // 开启日志,便于观察效果 .advisors(new MyLoggerAdvisor()) // 应用知识库问答 .advisors(new QuestionAnswerAdvisor(loveAppToAiCupidVectorStore)) .call() .chatResponse(); String content = chatResponse.getResult().getOutput().getText(); log.info("content: {}", content); return content; }

测试

java
复制代码
@Test void doChatWithRagToAiCupid() { String chatId = UUID.randomUUID().toString(); String message = "我是男生,22岁,喜欢睡觉"; String answer = loveApp.doChatWithRagToAiCupid(message, chatId); Assertions.assertNotNull(answer); }
image-20250509122811069

数据库实现

数据库内容

image-20250509122430580

关键代码

基于Mybatisplus 使用MybatisX 生成的就不写了

LoveAppDocumentToAiCupidMybatisPlusLoader

java
复制代码
package com.lihui.aiagent.rag; import com.lihui.aiagent.domain.Userprofile; import com.lihui.aiagent.mapper.UserprofileMapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.document.Document; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Component @Slf4j class LoveAppDocumentToAiCupidMybatisPlusLoader { @Resource private UserprofileMapper UserprofileMapper; /** * 从数据库加载用户资料 * * @return */ public List<Document> loadMarkdowns() { List<Document> allDocuments = new ArrayList<>(); try { List<Userprofile> Userprofiles = UserprofileMapper.selectList(null); for (Userprofile Userprofile : Userprofiles) { String content = String.format("**姓名**:%s,**年龄**:%d岁,**性别**:%s,**星座**:%s,**职业**:%s,**爱好**:%s,**择偶期望**:%s", Userprofile.getName(), Userprofile.getAge(), Userprofile.getGender(), Userprofile.getConstellation(), Userprofile.getOccupation(), Userprofile.getHobbies(), Userprofile.getPartnerexpectation()); Map<String, Object> metadata = new HashMap<>(); metadata.put("filename", "user_profile"); Document document = new Document(content, metadata); allDocuments.add(document); } } catch (Exception e) { log.error("用户资料从数据库加载失败", e); } return allDocuments; } }

LoveAppVectorStoreMybatisConfig

java
复制代码
package com.lihui.aiagent.rag; import jakarta.annotation.Resource; import org.springframework.ai.document.Document; 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; import java.util.List; @Configuration public class LoveAppVectorStoreMybatisConfig { @Resource private LoveAppDocumentToAiCupidMybatisPlusLoader loveAppDocumentToAiCupidMybatisPlusLoader; @Bean VectorStore loveAppToAiCupidVectorStoreMybatis(EmbeddingModel dashscopeEmbeddingModel) { SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel) .build(); // 从数据库加载文档 List<Document> documents = loveAppDocumentToAiCupidMybatisPlusLoader.loadMarkdowns(); simpleVectorStore.add(documents); return simpleVectorStore; } }

LoveApp

java
复制代码
// AI媒婆(本地知识库实现 + 数据库) @Resource private VectorStore loveAppToAiCupidVectorStoreMybatis; public String doChatWithRagToAiCupidMybatis(String message, String chatId) { ChatResponse chatResponse = chatClient .prompt() .user(message) .system(SYSTEM_PROMPT + "对话完成后,请以列表形式提供与用户性别相异且匹配的资料,列表中的每个条目应包含姓名、年龄、爱好等基本信息。如果没有匹配的资料,请明确说明 '未找到匹配资料'。") .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)) // 开启日志,便于观察效果 .advisors(new MyLoggerAdvisor()) // 应用知识库问答 .advisors(new QuestionAnswerAdvisor(loveAppToAiCupidVectorStoreMybatis)) .call() .chatResponse(); String content = chatResponse.getResult().getOutput().getText(); log.info("content: {}", content); return content; }

测试

不知道为什么一直有无法输出的信息(云平台的监管)

java
复制代码
@Test void doChatWithRagToAiCupidMybatis() { String chatId = UUID.randomUUID().toString(); String message = "我是男生,22岁,喜欢睡觉"; String answer = loveApp.doChatWithRagToAiCupidMybatis(message, chatId); Assertions.assertNotNull(answer); }
image-20250509123155422
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
lihuibear
下载 APP