2026/3/25 19:42:12
网站建设
项目流程
专业建站公司联系方式,淘宝网做网站,网站建设存在的问题及解决办法,房地产电子商务的网站建设1、人工智能服务 AIService
1、什么是AIService
AIService使用面向接口和动态代理的方式完成程序的编写#xff0c;更灵活的实现高级功能。
链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链#xff0c;比如聊天机器人、检索增强生成#xf…1、人工智能服务 AIService1、什么是AIServiceAIService使用面向接口和动态代理的方式完成程序的编写更灵活的实现高级功能。链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链比如聊天机器人、检索增强生成RAG等。链将多个底层组件组合起来并协调它们之间的交互。链存在的主要问题是不灵活我们不进行深入的研究。AIService****可处理最常见的操作为大语言模型格式化输入内容解析大语言模型的输出结果它们还支持更高级的功能聊天记忆 Chat memory工具 Tools检索增强生成 RAG2、创建AIService引入依赖!--langchain4j高级功能--dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-spring-boot-starter/artifactId/dependency创建接口publicinterfaceAssistant{Stringchat(StringuserMessage);}测试用例SpringBootTestpublicclassAIServiceTest{AutowiredprivateQwenChatModelqwenChatModel;TestpublicvoidtestChat(){//创建AIServiceAssistantassistantAiServices.create(Assistant.class,qwenChatModel);//调用service的接口Stringanswerassistant.chat(Hello);System.out.println(answer);}}3、AiService注解也可以在Assistant 接口上添加AIService注解AiService(wiringModeEXPLICIT,chatModelqwenChatModel)publicinterfaceAssistant{Stringchat(StringuserMessage);}测试用例中我们可以直接注入Assistant对象AutowiredprivateAssistantassistant;TestpublicvoidtestAssistant(){Stringanswerassistant.chat(Hello);System.out.println(answer);}4、工作原理AiServices会组装Assistant接口以及其他组件并使用反射机制创建一个实现Assistant接口的代理对象。这个代理对象会处理输入和输出的所有转换工作。在这个例子中chat方法的输入是一个字符串但是大 模型需要一个 UserMessage 对象。所以代理对象将这个字符串转换为 UserMessage 并调用聊天语 言模型。chat方法的输出类型也是字符串但是大模型返回的是 AiMessage 对象代理对象会将其转换 为字符串。简单理解就是代理对象的作用是输入转换和输出转换2、聊天记忆 Chat memory1、测试对话是否有记忆SpringBootTestpublicclassChatMemoryTest{AutowiredprivateAssistantassistant;TestpublicvoidtestChatMemory(){Stringanswer1assistant.chat(我是环环);System.out.println(answer1);Stringanswer2assistant.chat(我是谁);System.out.println(answer2);}}很显然目前的接入方式大模型是没有记忆的。2、聊天记忆的简单实现AutowiredprivateQwenChatModelqwenChatModel;TestpublicvoidtestChatMemory2(){//第二轮对话UserMessageuserMessage2UserMessage.userMessage(你知道我是谁吗);//第一轮对话UserMessageuserMessage1UserMessage.userMessage(我是环环);ChatResponsechatResponse1qwenChatModel.chat(userMessage1);AiMessageaiMessage1chatResponse1.aiMessage();//输出大语言模型的回复System.out.println(aiMessage1.text());ChatResponsechatResponse2qwenChatModel.chat(Arrays.asList(userMessage1,aiMessage1,userMessage2));AiMessageaiMessage2chatResponse2.aiMessage();//输出大语言模型的回复System.out.println(aiMessage2.text());}3、使用ChatMemory实现聊天记忆使用AIService可以封装多轮对话的复杂性使聊天记忆功能的实现变得简单TestpublicvoidtestChatMemory3(){//创建chatMemoryMessageWindowChatMemorychatMemoryMessageWindowChatMemory.withMaxMessages(10);//创建AIServiceAssistantassistantAiServices.builder(Assistant.class).chatLanguageModel(qwenChatModel).chatMemory(chatMemory).build();//调用service的接口Stringanswer1assistant.chat(我是环环);System.out.println(answer1);Stringanswer2assistant.chat(我是谁);System.out.println(answer2);}4、使用AIService实现聊天记忆AiService(wiringModeEXPLICIT,chatModelqwenChatModel,chatMemorychatMemory)publicinterfaceMemoryChatAssistant{Stringchat(Stringmessage);}配置类进行配置ConfigurationpublicclassMemoryChatAssistantConfig{BeanChatMemorychatMemory(){//设置聊天记忆记录的message数量returnMessageWindowChatMemory.withMaxMessages(10);}}测试代码AutowiredprivateMemoryChatAssistantmemoryChatAssistant;TestpublicvoidtestChatMemory4(){Stringanswer1memoryChatAssistant.chat(我是环环);System.out.println(answer1);Stringanswer2memoryChatAssistant.chat(我是谁);System.out.println(answer2);}5、隔离聊天记忆为每个用户的新聊天或者不同的用户区分聊天记忆AiService(wiringModeEXPLICIT,chatMemorychatMemory,chatMemoryProviderchatMemoryProvider)publicinterfaceSeparateChatAssistant{/** * 分离聊天记录 * param memoryId 聊天id * param userMessage 用户消息 * return */Stringchat(MemoryIdintmemoryId,UserMessageStringuserMessage);}配置类如下ConfigurationpublicclassSeparateChatAssistantConfig{BeanChatMemoryProviderchatMemoryProvider(){returnmemoryId-MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).build();}}测试用例AutowiredprivateSeparateChatAssistantseparateChatAssistant;TestpublicvoidtestChatMemory5(){Stringanswer1separateChatAssistant.chat(1,我是环环);System.out.println(answer1);Stringanswer2separateChatAssistant.chat(1,我是谁);System.out.println(answer2);Stringanswer3separateChatAssistant.chat(2,我是谁);System.out.println(answer3);}3、持久化聊天记忆 Persistence默认情况下聊天记忆存储在内存中。如果需要持久化存储可以实现一个自定义的聊天记忆存储类 以便将聊天消息存储在你选择的任何持久化存储介质中。1、存储介质的选择大模型中聊天记忆的存储选择哪种数据库需要综合考虑数据特点、应用场景和性能要求等因素以下 是一些常见的选择及其特点MySQL特点关系型数据库。支持事务处理确保数据的一致性和完整性适用于结构化数据的存储和查询。适用场景如果聊天记忆数据结构较为规整例如包含固定的字段如对话 ID、用户 ID、时间戳、消息内容等且需要进行复杂的查询和统计分析如按用户统计对话次数、按时间范围查 询特定对话等MySQL 是不错的选择。Redis特点内存数据库读写速度极高。它适用于存储热点数据并且支持多种数据结构如字符 串、哈希表、列表等方便对不同类型的聊天记忆数据进行处理。适用场景对于实时性要求极高的聊天应用如在线客服系统或即时通讯工具Redis 可以快 速存储和获取最新的聊天记录以提供流畅的聊天体验。MongoDB特点文档型数据库数据以 JSON - like 的文档形式存储具有高度的灵活性和可扩展性。它 不需要预先定义严格的表结构适合存储半结构化或非结构化的数据。适用场景当聊天记忆中包含多样化的信息如文本消息、图片、语音等多媒体数据或者消 息格式可能会频繁变化时MongoDB 能很好地适应这种灵活性。例如一些社交应用中用户可 能会发送各种格式的消息使用 MongoDB 可以方便地存储和管理这些不同类型的数据。Cassandra特点是一种分布式的 NoSQL 数据库具有高可扩展性和高可用性能够处理大规模的分布 式数据存储和读写请求。适合存储海量的、时间序列相关的数据。适用场景对于大型的聊天应用尤其是用户量众多、聊天数据量巨大且需要分布式存储和处 理的场景Cassandra 能够有效地应对高并发的读写操作。例如一些面向全球用户的社交媒 体平台其聊天数据需要在多个节点上进行分布式存储和管理Cassandra 可以提供强大的支持。2、持久化聊天1、优化实体类DataAllArgsConstructorNoArgsConstructorDocument(chat_messages)publicclassChatMessages{//唯一标识映射到 MongoDB 文档的 _id 字段IdprivateObjectIdid;privateintmessageId;privateStringcontent;//存储当前聊天记录列表的json字符串}2、创建持久化类创建一个类实现ChatMemoryStore接口ComponentpublicclassMongoChatMemoryStoreimplementsChatMemoryStore{AutowiredprivateMongoTemplatemongoTemplate;OverridepublicListChatMessagegetMessages(ObjectmemoryId){CriteriacriteriaCriteria.where(memoryId).is(memoryId);QueryquerynewQuery(criteria);ChatMessageschatMessagesmongoTemplate.findOne(query,ChatMessages.class);if(chatMessagesnull)returnnewLinkedList();returnChatMessageDeserializer.messagesFromJson(chatMessages.getContent());}OverridepublicvoidupdateMessages(ObjectmemoryId,ListChatMessagemessages){CriteriacriteriaCriteria.where(memoryId).is(memoryId);QueryquerynewQuery(criteria);UpdateupdatenewUpdate();update.set(content,ChatMessageSerializer.messagesToJson(messages));//根据query条件能查询出文档则修改文档否则新增文档mongoTemplate.upsert(query,update,ChatMessages.class);}OverridepublicvoiddeleteMessages(ObjectmemoryId){CriteriacriteriaCriteria.where(memoryId).is(memoryId);QueryquerynewQuery(criteria);mongoTemplate.remove(query,ChatMessages.class);}}在SeparateChatAssistantConfig中添加MongoChatMemoryStore对象的配置ConfigurationpublicclassSeparateChatAssistantConfig{//注入持久化对象AutowiredprivateMongoChatMemoryStoremongoChatMemoryStore;BeanChatMemoryProviderchatMemoryProvider(){returnmemoryId-MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).chatMemoryStore(mongoChatMemoryStore)//配置持久化对象.build();}}4、提示词 Prompt1、系统提示词SystemMessage设定角色塑造AI助手的专业身份明确助手的能力范围2、配置SystemMessage在SeparateChatAssistant类的chat方法上添加SystemMessage注解SystemMessage(你是我的好朋友请用东北话回答问题。)//系统消息提示词Stringchat(MemoryIdintmemoryId,UserMessageStringuserMessage);SystemMessage 的内容将在后台转换为 SystemMessage 对象并与UserMessage 一起发送给大语言模型LLM。SystemMessaged的内容只会发送给大模型一次。如果你修改了SystemMessage的内容新的SystemMessage会被发送给大模型之前的聊天记忆会失效。SpringBootTestpublicclassPromptTest{AutowiredprivateSeparateChatAssistantseparateChatAssistant;TestpublicvoidtestSystemMessage(){StringanswerseparateChatAssistant.chat(3,今天几号);System.out.println(answer);}}在Assistant中配置如果要显示今天的日期我们需要在提示词中添加当前日期的占位符{{current_date}}SystemMessage(你是我的好朋友请用东北话回答问题。今天是{{current_date}})//系统消息提示词Stringchat(MemoryIdintmemoryId,UserMessageStringuserMessage);1、从资源中加载提示模板SystemMessage 注解还可以从资源中加载提示模板SystemMessage(fromResourcemy-prompt-template.txt)Stringchat(MemoryIdintmemoryId,UserMessageStringuserMessage);my-prompt-template.txt文章中的内容你是我的好朋友请用东北话回答问题回答问题的时候适当添加表情符号。 今天是{{current_date}}。3、用户提示词模板UserMessage获取用户输入1、配置UserMessage在 MemoryChatAssistant 的 chat 方法中添加注解UserMessage(你是我的好朋友请用上海话回答问题并且添加一些表情符号。 {{it}})//{{it}}表示这里唯一的参数的占位符Stringchat(Stringmessage);测试用例AutowiredprivateMemoryChatAssistantmemoryChatAssistant;TestpublicvoidtestUserMessage(){StringanswermemoryChatAssistant.chat(我是环环);System.out.println(answer);}指定参数名称V** **明确指定传递的参数名称单参数可以省略UserMessage(你是我的好朋友请用上海话回答问题并且添加一些表情符号。{{message}})Stringchat(V(message)StringuserMessage);多参数必须加上如果有两个或两个以上的参数我们必须要用 V 在 SeparateChatAssistant 中定义方法 chat2UserMessage(你是我的好朋友请用粤语回答问题。{{message}})Stringchat2(MemoryIdintmemoryId,V(message)StringuserMessage);UserMessage 中的内容每次都会被和用户问题组织在一起发送给大模型SystemMessage和V也可以将 SystemMessage 和 V 结合使用在 SeparateChatAssistant 中添加方法chat3SystemMessage(fromResourcemy-prompt-template3.txt)Stringchat3(MemoryIdintmemoryId,UserMessageStringuserMessage,V(username)Stringusername,V(age)intage);创建提示词模板my-prompt-template3.txt添加占位符你是我的好朋友我是{{username}}我的年龄是{{age}}请用东北话回答问题回答问题的时候适当添加表情 符号。 今天是{{current_date}}。测试TestpublicvoidtestUserInfo(){StringanswerseparateChatAssistant.chat3(1,我是谁我多大了,翠花,18);System.out.println(answer);}