【Ai智能客服上篇】
摘要:
本文主要介绍了如何在阿里云百炼平台接入通义大模型进行智能客服开发。同时深入到项目的角度对如何搭建一个智能客服的全过程进行了讲解,普及了AI应用开发的几个重要概念,如:提示词prompt、聊天记忆ChatMemory和交互实例ChatClient等,意在帮助各位小伙伴快速开发自己的智能客服应用。
一,基本配置
1,选择大模型
作者这里选择的是阿里百炼平台的通义大模型--文本生成通义千问plus,如果大家有其他的选择可以自行配置
2,开通阿里云百炼平台的密钥
(1)新人开通优惠都会给予免费额度,基本足够使用
(2)百炼平台首页点击模型,左侧应用栏最下方的“密钥管理”,点击创建API-KEY(密钥非常重要,请妥善保管)
3,选择接入方式
阿里百炼平台提供了两种大模型的调用模式,OpenAi兼容和DashScope(阿里原生态)
1,OpenAI:
(1)外部第三方服务:依赖 OpenAI 的云端 API(如 GPT-4、GPT-3.5 Turbo),模型训练和部署完全由 OpenAI 掌控,百炼平台仅作为调用通道。
(2)独立工具生态:需通过 OpenAI 官方 SDK 或百炼提供的兼容接口调用,工具链需单独配置。
2,DashScope:
(1)阿里云自研服务:基于通义大模型(如通义千问、通义听悟),深度整合阿里云基础设施(如 OSS、KMS),支持本地化数据处理和合规性要求。
(2)中文优化与多模态能力:针对中文语义优化,支持图文音三模态融合(如 ONE-PEACE 模型),在多模态检索、实时语音交互等场景表现更优。
(3)全链路开发工具:百炼平台提供模型调优、Prompt 工程、可视化流程编排等工具,可直接在平台内完成从训练到部署的全流程。
所以,通常会选择DashScope的原生态方式调用通义大模型,有助于后续的业务开发和开发者详细的PAI参考。如果想要了解更多有关这两种API调用的具体差异和实现可以自行在百炼控制平台对通用千问API的详细文档,那里有不同语言的具体方式实现及各种参数。
二,开发前配置
1,引入依赖
建议引入spring-ai-core和spring-ai-alibaba-stater-dashscope构建以封装各种实现更加简洁的Spring Ai框架的调用方式,而非纯阿里原生态的复杂调用。
<!-- Spring Ai核心依赖 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>1.0.0</version>
</dependency>
<!-- 阿里DashScope平台 -->
<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version>
</dependency>
(1)阿里原生态的调用方式(手动构建参数,繁琐但功能更强大)
public class Main {public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {Generation gen = new Generation();Message systemMsg = Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build();Message userMsg = Message.builder().role(Role.USER.getValue()).content("你是谁?").build();GenerationParam param = GenerationParam.builder().apiKey(System.getenv("DASHSCOPE_API_KEY")).model("qwen-plus").messages(Arrays.asList(systemMsg, userMsg)).resultFormat(GenerationParam.ResultFormat.MESSAGE).build();return gen.call(param);}public static void main(String[] args) {try {GenerationResult result = callWithMessage();System.out.println(JsonUtils.toJson(result));} catch (ApiException | NoApiKeyException | InputRequiredException e) {System.err.println("An error occurred while calling the generation service: " + e.getMessage());}System.exit(0);}
}
(2)Spring Ai框架的调用方式(简洁通用,适合新手开发)
public Flux<String> chat(String prompt) {//请求模型return chatClient.prompt().user(prompt).system(p->p.param("current_date", LocalDate.now())).advisors(a -> a.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,LoginUserHolder.getLoginUser().getUserId())).stream().content();}
这两种方式各有优劣,但是Spring AI+DashScope的方式更加适合快速的企业开发构建应用,通过标准化抽象和生态整合大幅降低开发成本,也对新手更加友好。
2,配置yaml文件
DashScope平台调用对话大模型的一些基础参数配置:模型选择options、api-key.....等等
spring:ai:dashscope:chat:enabled: trueoptions:model: qwen-plusapi-key: # 你的APi密钥base-url: https://dashscope.aliyuncs.com/compatible-mode/v1# 日志输出级别debug,方便检查
logging:level:org.springframework.ai.chat.client.advisor: debugcom.muyi.ai: debug
三,代码开发
1,手动构建ChatClient实例
ChatClient简单来说就是装载模型默认信息的Bean(实例),如:系统提示词和拦截器Advisors等,如果有小伙伴还想了解更多ChatClient的知识,可以访问聊天客户端 API :: Spring AI 中文文档
(1)新建配置类ChatClientConfiguration并标记@Configuration
(2)构建chatclient的Bean,并在形参自动注入DashScopeChatModel
(3)默认的拦截器:日志拦截器。拦截器非常有用,不仅仅是日志输出,还有记忆化能力以及RAG库等等,更多详情小伙伴可自行查阅:Advisor API :: Spring AI 中文文档
@Configuration
public class ChatClientConfiguration {@Beanpublic ChatClient chatClient(DashScopeChatModel model){return ChatClient.builder(model)//系统提示词.defaultSystem(new ClassPathResource("system_prompt.txt"))//拦截器:日志拦截器.defaultAdvisors(new SimpleLoggerAdvisor()).build();}
}
2,配置系统提示词
系统提示词简单来说就是给AI模型赋予一个角色身份,如:你是xxx,你负责xxx...等,因此身份信息越详细,AI更加真实。有关提示词小伙伴可以跳转下方链接进行更加深入了解:
【Prompt提示词】_springai 动态提示词prompt-CSDN博客
(1)一般直接配置在项目的resource资源下,使用文件路径读取,文件名保持一致
(2)生成系统提示词,让AI成为一个拥有具体身份的角色
系统提示词对于应用开发非常重要,大家尽量详细清晰,但因为测试阶段可以粗略一些,如果自己不会写可以让豆包或者deepseek生成,但是描述也要清晰有逻辑。
你是房屋租赁平台的智能客服“小居”,负责为用户提供租房全流程的贴心服务。
你的核心职责是用和蔼亲和的语气,自然流畅地解答用户租房相关问题,让用户感受到专业又温暖的支持。面对用户咨询时,需主动理解需求:若用户找房,需询问预算、户型、位置等关键信息并精准匹配;
若涉及签约流程,需清晰说明合同条款、押金规则、租期要求等细节;
若反馈房屋问题,要耐心记录故障情况并指引报修流程。
交流中多用生活化表达,避免生硬术语,适时使用语气词(如“呀”“呢”)增强亲切感。
当用户情绪焦虑时,先安抚情绪再解决问题;
对不确定的信息,明确告知“我帮你确认后回复”或转接人工,不随意承诺。
始终以“帮用户轻松租房”为目标,让每一次互动都高效又暖心~ 要求:
1,在涉及增删改(除了查询)的function-call前,必须等用户回复“确认”后再调用tool。
2,如果函数调用后返回结果为空则提示用户“敬请期待”。
3,全程必须用中文与用户交流。
3,聊天记忆
顾名思义,让大模型具有“记忆”的能力,实际上大模型是没有记忆的能力,大模型之所以能够“记忆”是因为把上下文对话一起作为文本发送给大模型,聊天记忆详细信息小伙伴可访问下方连接:
【ChatMemory聊天记忆】_jdbcchatmemoryrepository-CSDN博客
(1)定义基于内存的记忆化,通过ChatMemory的实现类MessageWindowChatMemory配置一些基本参数,储存方式:内存,读取的最大信息数量:20条。
@Beanpublic ChatMemory chatMemory(){return MessageWindowChatMemory.builder()//new InMemoryChatMemoryRepository()基于内存.chatMemoryRepository(new InMemoryChatMemoryRepository()).maxMessages(20).build();}
(2)在构建ChatClient的Bean的形参中自动注入ChatMemory chatMemory,并添加聊天记忆拦截器到ChatClient的默认拦截器中
@Beanpublic ChatClient chatClient(DashScopeChatModel model,ChatMemory chatMemory){return ChatClient.builder(model).defaultSystem(new ClassPathResource("system_prompt.txt")).defaultAdvisors(new SimpleLoggerAdvisor(),new MessageChatMemoryAdvisor(chatMemory)).build();}
4,模型交互实现
(1)新建AIServiceController实现根据用户提示词与大模型交互功能
(2)通过构造器的方式注入chatClient并添加final关键字保证不可修改
(3)实现请求模型的具体方法,并通过流式(将数据分块处理、分批次返回,实现“边处理边传输”)的方式返回模型生成的结果,指定结果方式text/html和字符集utf-8。
(4)”用户输入“prompt作为用户提示词,拦截器中指定记忆化的K-V,key值为常量,通过不同的value实现记忆隔离,否则不同用户就会出现结果交错偏离的错误。
@RestController
@RequiredArgsConstructor
@RequestMapping("/app/ai/service")
public class AiServiceController {private final ChatClient chatClient;@GetMapping(value = "/chat", produces = "text/html;charset=UTF-8")public Flux<String> chat(String prompt) {//请求模型return chatClient.prompt().user(prompt).advisors(a -> a.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,LoginUserHolder.getLoginUser().getUserId())).stream().content();}
}
四,总结
至此,一个基本的Ai交互也就实现的差不多了,包括记忆化,记忆隔离,日志输出...等,但是如果要作为智能客服还缺少一些重要的功能:
函数调用(工具(Tool)调用 :: Spring AI 中文文档),让智能客服能够调用项目业务中的方法,比如预约订房等;
RAG知识库搭建(向量数据库 :: Spring AI 中文文档),使智能客服更加真实且专业也更加契合项目业务。
这里给出Spring官方对于这两项的文档,小伙伴可以根据官方文档自己尝试实现函数调用的功能,成功后可以试试结合自己项目中的业务方法实现。在下篇中会具体讲解如何实现这两项功能,完善智能客服。