springboot集成langchain4j实现票务助手实战

前言

看此篇的前置知识为langchain4j整合springboot,以及springboot集成langchain4j记忆对话。

Function-Calls介绍

  • langchain4j 中的 Function Calls(函数调用)是一种让大语言模型(LLM)与外部工具(如 API、代码执行器等)交互的机制。通过这种机制,LLM 可以根据上下文动态调用开发者预定义的函数,从而扩展其能力边界,解决纯文本生成无法处理的复杂任务(如数学计算、实时数据查询、业务逻辑处理等)。
  • 对于基础大模型来说,他只具备通用信息,他的参数都是拿公网进行训练,并且有一定的时间延迟,无法得知一些具体业务数据和实时数据,这些数据往往被各软件系统存储在自己数据库中:
  • 比如我现在开发一个智能票务助手我现在跟AI说需要退票,AI怎么做到呢?就需要让AI调用我们自己系统的退票业务方法,进行数据库操作。
  • 那这些都可以通过function-call进行完成,更多的用于实现类似智能客服场景,因为客服需要帮用户解决业务问题(就需要调用业务方法)。

Function-Calls流程

比如: 现在当用户问的是“kizzo页面访问量有多少”,大模型需要从程序内部获取
1.问大模型 “页面访问量有多少”
2.大模型在识别到你的问题是:“kizzo页面访问量有多少”
3.大模型提取“访问量”
4.调用 pageViewCount方法
5.通过返回的结果再结合上下文再次请求大模型
6.响应“Kizzo页面的访问量目前有1000次。”

用户 应用langchain4j 大模型 页面访问量有多少? 调用记忆接口,输入message"页面访问量有多少?" 提取关键字"访问量”并调用pageViewCount方法" 返回1000 组织语言,返回"Kizzo页面的访问量目前有1000次。" Kizzo页面的访问量目前有1000次。 用户 应用langchain4j 大模型

Function-Calls代码实现

  1. 加入回调
@Service
@Slf4j
public class ToolsService {@Tool("kizzo页面访问量有多少")public Integer pageViewCount(@P("访问量") String pv){//todo 此处可以查询数据库或rpc方法log.info("pv:{}", pv);// 结果return 1000;}
}

ToolsService配置为了一个bean
@Tool 用于告诉AI什么对话调用这个方法
@P(“访问量")用于告诉AI,调用方法的时候需要提取对话中的什么信息,这里提取的是访问量

  1. 在AiConfig中的助手对象增加Function-Calls Tools
    @Beanpublic Assistant assistant(ChatLanguageModel chatLanguageModel, StreamingChatLanguageModel streamingChatLanguageModel, ToolsService toolsService){// 最多存储多少聊天记录ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);// 为Assistant动态代理对象chat ---> 对话内容存储ChatMemoryi ---> 聊天记录ChatMemory取出来 ---->放入到当前对话中Assistant assistant = AiServices.builder(Assistant.class).tools(toolsService).chatLanguageModel(chatLanguageModel).streamingChatLanguageModel(streamingChatLanguageModel).chatMemory(chatMemory).build();return assistant;}

再次调用后结果如下:
在这里插入图片描述

预设角色(系统消息SystemMessage)

基础大模型是没有目的性的,你聊什么给什么,但是如果我们开发的事一个智能票务助手,我需要他以一个票务助手的角色跟我对话, 并且在我跟他说”退票”的时候, 让大模型一定要告诉我“车次”和“姓名"这样我才能去调用业务方法(假设有一个业务方法,需要根据车子和姓名才能查询具体车票),进行退票。
在langchain4j中实现也非常简单

  • @SystemMessage 系统消息,一般做一些预设角色的提示词,设置大模型的基本职责
  • 可以通过{{current date}} 传入参数,因为预设词中的文本可能需要实时变化
  • @V(“current date”),通过@V传入{{}中的参数
  • 一旦参数不止一个,就需要通过@UserMessage设置用户信息

代码实现:

  1. 在AiConfig中的助手对象重载一个stream流输出方法,用@SystemMessage预设提示词角色
        @SystemMessage("""您是“xx”航空公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。您正在通过在线聊天系统与客户互动。在提供有关预订或取消预订的信息之前,您必须始终从用户处获取以下信息:预订号、客户姓名。请讲中文。今天的日期是 {{current_date}}.""")TokenStream stream(@UserMessage String message, @V("current_date") String currentDate);
  1. 在ToolsService中新增一个tool
    @Tool("退票")public String cancelBooking(@P("地区") String bookingNumber,@P("姓名") String name){//todo 业务方法,退票数据库操作log.info("bookingNumber:{},name:{}", bookingNumber,name);// 结果return "退票成功";}
  1. Controller中新增一个接口调用
    // 预设角色记忆流对话@RequestMapping(value = "/system_message_chat_stream",produces = "text/stream;charset=UTF8")public Flux<String> systemMessageStreamChat(@RequestParam(defaultValue="我是谁") String message) {TokenStream stream = assistant.stream(message, LocalDate.now().toString());return Flux.create(sink ->  {stream.onPartialResponse(s -> sink.next(s)).onCompleteResponse(c -> sink.complete()).onError(sink::error).start();});}

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-数据库分布式XA事务

准备 innodb存储引擎开启支持分布式事务 set global innodb_support_axonMySQL数据库XA事务的SQL语法如下&#xff1a; XA {START| BEGIN} xid {JOIN | RESUME} XA END xid {SUSPEND [ FOR MIGRATE]} XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER 完…

SAP 运维-冷门问题解决办法

1.SAP Fiori帮助菜单链接如何配置&#xff1f; 答&#xff1a; 执行事务代码HELP_CONFIG&#xff0c;选择对应的Fiori部署模式&#xff0c;配置帮助菜单下的URL链接。 检查配置的帮助菜单&#xff0c;执行事务代码/N//UI2/FLP_CUS_CONF 或者SR13进行查看配置状态与修改。

新型智慧园区技术架构深度解析:数字孪生与零碳科技的融合实践

&#x1f3ed;在杭州亚运村零碳园区&#xff0c;光伏板与氢燃料大巴构成的能源网络&#xff0c;正通过数字孪生技术实现智能调度。这不仅是格力电器与龙源电力在新能源领域的创新实践&#xff0c;更是智慧园区4.0时代的标杆案例。当AI算法开始接管能源调度&#xff0c;当BIM建模…

Java转Go日记(三十六):简单的分布式

1.1.1. 简单的分布式server 目前分布式系统已经很流行了&#xff0c;一些开源框架也被广泛应用&#xff0c;如dubbo、Motan等。对于一个分布式服务&#xff0c;最基本的一项功能就是服务的注册和发现&#xff0c;而利用zk的EPHEMERAL节点则可以很方便的实现该功能。EPHEMERAL节…

机器学习笔记——特征工程

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的特征工程方法、正则化方法和简要介绍强化学习。 文章目录 特征工程&#xff08;Fzeature Engineering&#xff09;1. 特征提取&#xff…

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1

在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1&#xff0c;可以通过以下步骤完成&#xff1a; 方法 1&#xff1a;使用 pip 安装&#xff08;推荐&#xff09; 步骤 1&#xff1a;卸载旧版本 SCons # 如果通过 apt 安装的旧版本&#xff0c;先卸载 sudo apt remov…

LeetCode热题100--234.回文链表--简单

1. 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xf…

【markdown】介绍如何在markdown中绘制流程图

在 Markdown 中编写流程图主要通过 ​​Mermaid 语法​​实现&#xff08;多数平台如 GitHub、VS Code、Typora 已原生支持&#xff09;。以下是详细方法&#xff1a; 1. 基础流程图​​ 语法结构 用 mermaid 包裹代码块&#xff0c;指定方向后定义节点和连接线&#xff1a…

Java中使用自定义序列化器:自动添加View字段的实现与应用

Java 中 BigDecimal 序列化器:自动添加 View 返回字段的实现与应用 在 Java 开发过程中,数据的序列化与反序列化是非常重要的环节。当我们处理数值类型数据,特别是BigDecimal类型时,有时需要在序列化输出中添加额外的视图字段,以满足前端展示或者特定业务需求。本文将通过…

Java类一文分解:JavaBean,工具类,测试类的深度剖析

解锁Java类的神秘面纱&#xff1a;从JavaBean到测试类的深度剖析 前言一、JavaBean 类&#xff1a;数据的守护者&#xff08;一&#xff09;JavaBean 类是什么&#xff08;二&#xff09;JavaBean 类的特征&#xff08;三&#xff09;JavaBean 类的使用场景&#xff08;四&…

机器学习-- 线性回归、逻辑回归

线性回归 线性回归是一种统计方法,用于发现变量之间的关系。在机器学习背景下,线性回归可找出特征(Feature)与标签(Lable)之间的关系。 例如,假设我们想要根据汽车的重量预测汽车的每加仑汽油行驶里程(mpg),并且我们有以下数据集: 线性回归方程 Linear regressi…

Lua再学习

因为实习的项目用到了Lua&#xff0c;所以再来深入学习一下 函数 函数的的多返回值 Lua中的函数可以实现多返回值&#xff0c;实现方法是再return后列出要返回的值的列表&#xff0c;返回值也可以通过变量接收到&#xff0c;变量不够也不会影响接收对应位置的返回值 Lua中传…

TCP协议十大核心特性深度解析:构建可靠传输的基石

TCP&#xff08;传输控制协议&#xff09;作为互联网的"交通指挥官"&#xff0c;承载着全球80%以上的网络流量。本文将深入解析TCP协议的十大核心特性&#xff0c;通过原理剖析、流程图解和实战案例&#xff0c;揭示其如何实现高效可靠的数据传输。 一、面向连接的可…

基于 Spring Boot 瑞吉外卖系统开发(十三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十三&#xff09; 查询套餐 在查询套餐信息时包含套餐的分类名&#xff0c;分类名称在category表中&#xff0c;因此这里需要进行两表关联查询。 自定义SQL如下&#xff1a; select s.* ,c.name as category_name from setmeal…

华为IP(6)

VLAN聚合 VLAN聚合产生的技术背景 在一般是三层交换机中&#xff0c;通常采用一个VLAN接口的方式实现广播域之间的互通&#xff0c;这在某些情况下导致了IP地址的浪费 因为一个VLAN对应的子网中&#xff0c;子网号、子网广播地址、子网网关地址不能用作VLAN内的主机IP地址&a…

深度解析IP静态的工作原理,IP静态的应用场景又哪些?

一、什么是IP静态&#xff1f; 当我们谈到“IP静态”时&#xff0c;大家可能首先想到的是与“动态IP”相对的概念。确实如此&#xff0c;静态IP是一种固定分配的IP地址&#xff0c;也就是说&#xff0c;在特定时间内&#xff0c;分配给你的IP地址不会有所更改——无论你完成多…

docker(四)使用篇一:docker 镜像仓库

前文我们已经介绍了 docker 并安装了 docker&#xff0c;下面我们将正式步入使用环节&#xff0c;本章是第一个使用教学&#xff1a;docker 镜像仓库。 一、什么是镜像仓库 所谓镜像仓库&#xff0c;其实就是负责存储、管理和分发镜像的仓库&#xff0c;并且建立了仓库的索引…

单片机开发软件

目录 纯编码 vscode Ardunio Keil 1. 集成化开发环境&#xff08;IDE&#xff09; 2. 多架构芯片支持 3. 高效的代码生成与优化 4. 强大的调试与仿真功能 5. 丰富的库函数与生态系统 6. 教育与企业级适用性 典型应用场景 半编码半图形化 STM32CUBEIED 1. 图形化配置…

【虚幻引擎】UE5独立游戏开发全流程(商业级架构)

本套课程我将会讲解一下知识 1.虚幻引擎的常用功能节点、模块包含但不限于动画模块、UI模块、AI模块、碰撞模块、伤害模块、背包模块、准心模块、武器模块、可拾取物品模块、死亡等模块。 2.整个游戏的设计思路&#xff08;游戏架构&#xff09;&#xff0c;本套教程讲解了如…

ABP-Book Store Application中文讲解 - Part 2: The Book List Page

本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…