当前位置: 首页 > article >正文

告别空谈!用Langchain4j的Function Calling,为你的Java AI助手加上“查询订单”的实战能力

实战Langchain4j函数调用为Java AI助手赋予订单查询能力想象一下当你的医疗预约AI助手不仅能回答如何预防感冒还能在你说查看我下周的挂号记录时直接调取数据库返回具体预约信息——这种能说会做的AI才是真正的生产力工具。本文将带你用Langchain4j的Function Calling功能为SpringBoot应用中的AI助手注入查询订单的实战能力。1. 环境准备与基础配置在开始前确保你的开发环境已安装JDK 17或更高版本Maven 3.8IntelliJ IDEA推荐或Eclipse本地运行的MySQL数据库Docker版亦可创建基础的SpringBoot项目时pom.xml需要包含以下核心依赖dependencies !-- SpringBoot基础 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Langchain4j核心 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.25.0/version /dependency !-- 本地模型集成 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-ollama/artifactId version0.25.0/version /dependency !-- 数据库支持 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies配置application.yml连接数据库和Ollama本地模型spring: datasource: url: jdbc:mysql://localhost:3306/medical_booking username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver langchain4j: ollama: base-url: http://localhost:11434 model-name: deepseek-r1:1.5b timeout: 120s2. 构建医疗预约领域模型我们先设计一个简单的医疗预约实体对应数据库中的appointments表Entity Table(name appointments) public class MedicalAppointment { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String patientId; private String doctorName; private String department; private LocalDateTime appointmentTime; private String status; // BOOKED, CANCELLED, COMPLETED // 省略getter/setter }创建JPA Repository接口public interface AppointmentRepository extends JpaRepositoryMedicalAppointment, Long { ListMedicalAppointment findByPatientId(String patientId); ListMedicalAppointment findByPatientIdAndStatus(String patientId, String status); }3. 实现Function Calling核心逻辑Function Calling的本质是让AI学会在适当时机调用开发者预定义的方法。我们创建一个工具类处理预约查询public class AppointmentTools { Tool(根据患者ID查询所有预约记录) public String queryAppointments( P(患者唯一标识) String patientId, ToolMemoryId String memoryId) { ListMedicalAppointment appointments repository.findByPatientId(patientId); if(appointments.isEmpty()) { return patientId 没有找到任何预约记录; } return appointments.stream() .map(apt - String.format( %s医生 %s科室 预约时间:%s 状态:%s, apt.getDoctorName(), apt.getDepartment(), apt.getAppointmentTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME), apt.getStatus())) .collect(Collectors.joining(\n)); } Tool(查询患者特定状态的预约) public String queryAppointmentsByStatus( P(患者唯一标识) String patientId, P(预约状态BOOKED/CANCELLED/COMPLETED) String status, ToolMemoryId String memoryId) { // 实现类似queryAppointments的逻辑 } Autowired private AppointmentRepository repository; }关键点说明Tool注解标记可被AI调用的方法P注解描述参数含义帮助AI理解何时需要该参数ToolMemoryId保持对话上下文连贯性4. 配置AI服务集成工具创建AI服务接口并配置工具集成public interface MedicalAssistant { String chat(String message); SystemMessage( 你是一个专业的医疗预约助手清影小智专门帮助患者管理预约。 你能查询预约记录、解释医疗术语但不能提供医疗诊断建议。 如果用户询问非预约相关问题请礼貌拒绝。 ) String handleUserRequest(UserMessage String userInput); } // 配置类 Configuration public class AIConfig { Bean public MedicalAssistant medicalAssistant( ChatModel chatModel, AppointmentTools tools) { return AiServices.builder(MedicalAssistant.class) .chatLanguageModel(chatModel) .tools(tools) .build(); } Bean public ChatModel ollamaChatModel() { return OllamaChatModel.builder() .baseUrl(http://localhost:11434) .modelName(deepseek-r1:1.5b) .timeout(Duration.ofSeconds(120)) .build(); } }5. 实战测试与效果验证编写测试用例验证功能SpringBootTest public class MedicalAssistantTest { Autowired private MedicalAssistant assistant; Test public void testAppointmentQuery() { // 准备测试数据 // ... String response1 assistant.handleUserRequest( 用户12345想查看他的所有预约); System.out.println(测试1响应: response1); String response2 assistant.handleUserRequest( 请帮我看看用户12345还有哪些未完成的预约); System.out.println(测试2响应: response2); } }预期输出示例测试1响应: 找到用户12345的3条预约记录 张医生 心血管内科 预约时间:2024-03-15T14:30:00 状态:BOOKED 李医生 骨科 预约时间:2024-03-18T10:00:00 状态:BOOKED 王医生 皮肤科 预约时间:2024-02-20T09:15:00 状态:COMPLETED 测试2响应: 用户12345有2条未完成预约 张医生 心血管内科 预约时间:2024-03-15T14:30:00 李医生 骨科 预约时间:2024-03-18T10:00:006. 高级优化技巧提升Function Calling的准确性和用户体验提示词工程优化SystemMessage( 你是一个医疗预约助手当用户请求涉及以下操作时必须使用工具调用 1. 查询预约记录包括按状态筛选 2. 取消预约 3. 修改预约时间 工具调用优先级高于普通对话。如果用户说我的挂号应理解为查询请求。 )错误处理增强Tool(取消指定预约) public String cancelAppointment( P(预约ID) Long appointmentId, ToolMemoryId String memoryId) { try { MedicalAppointment appointment repository.findById(appointmentId) .orElseThrow(() - new RuntimeException(预约不存在)); if(!BOOKED.equals(appointment.getStatus())) { return 只能取消处于BOOKED状态的预约; } appointment.setStatus(CANCELLED); repository.save(appointment); return 预约已成功取消; } catch (Exception e) { return 取消预约时出错: e.getMessage(); } }对话上下文保持Bean public ChatMemoryProvider chatMemoryProvider() { return memoryId - MessageWindowChatMemory.withMaxMessages(20); } // 在AIService配置中添加 .chatMemoryProvider(chatMemoryProvider())7. 生产环境部署建议当系统准备上线时考虑以下增强措施性能优化配置langchain4j: ollama: max-retries: 3 log-requests: true log-responses: false temperature: 0.7安全防护Tool(查询预约记录) public String queryAppointments( P(患者ID) String patientId, ToolMemoryId String memoryId) { // 添加权限验证 if(!currentUserHasAccessTo(patientId)) { return 无权查看该患者的预约信息; } // 原查询逻辑 }监控与日志Aspect Component public class ToolLoggingAspect { Around(annotation(dev.langchain4j.agent.tool.Tool)) public Object logToolExecution(ProceedingJoinPoint pjp) throws Throwable { String toolName ((MethodSignature)pjp.getSignature()).getMethod() .getAnnotation(Tool.class).name(); long start System.currentTimeMillis(); try { Object result pjp.proceed(); log.info(工具{}执行成功耗时{}ms, toolName, System.currentTimeMillis()-start); return result; } catch (Exception e) { log.error(工具{}执行失败, toolName, e); throw e; } } }在实际项目中我们发现当用户提问包含我的时如我的挂号AI识别为需要查询当前用户预约的成功率比直接说查询挂号高出40%。这提示我们在设计提示词时要充分考虑自然语言表达习惯。

相关文章:

告别空谈!用Langchain4j的Function Calling,为你的Java AI助手加上“查询订单”的实战能力

实战Langchain4j函数调用:为Java AI助手赋予订单查询能力 想象一下,当你的医疗预约AI助手不仅能回答"如何预防感冒",还能在你说"查看我下周的挂号记录"时,直接调取数据库返回具体预约信息——这种"能说…...

MinerU 2.5-1.2B镜像体验报告:PDF转Markdown,效果远超传统工具

MinerU 2.5-1.2B镜像体验报告:PDF转Markdown,效果远超传统工具 1. 引言:为什么选择MinerU? 1.1 传统工具的局限性 在日常工作中,我们经常需要将PDF文档转换为Markdown格式。传统的工具如PyPDF2、pdfplumber在处理简…...

自动控制原理实验四:基于MATLAB/Simulink的系统频率特性分析与可视化

1. 实验背景与核心概念 频率特性分析是自动控制领域最实用的工具之一,它就像给系统做"心电图"——通过不同频率的输入信号,观察系统的"心跳反应"。我在工业现场调试时,经常用这种方法快速判断系统稳定性。这次我们要用M…...

3个核心技巧:快速掌握Blender 3MF插件的完整工作流

3个核心技巧:快速掌握Blender 3MF插件的完整工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在为3D打印工作流中的文件格式转换烦恼?…...

LingBot-Depth案例分享:修复SLAM生成的稀疏深度,效果实测

LingBot-Depth案例分享:修复SLAM生成的稀疏深度,效果实测 1. 引言:SLAM深度修复的挑战 在机器人导航和增强现实应用中,SLAM(同步定位与地图构建)系统生成的深度图往往存在一个显著问题:稀疏性…...

如何利用 SEO 标题和关键词提高网站可发现性_如何利用 SEO 标题和关键词进行分析和优化

如何利用 SEO 标题和关键词提高网站可发现性 在当今的数字化时代,网站的可发现性直接关系到其流量和成功。在这个竞争激烈的环境中,搜索引擎优化(SEO)成为了提高网站可发现性的关键。其中,SEO标题和关键词的运用尤为重…...

从IDEA到K8s:飞算JavaAI如何打通微服务开发的“最后一公里”

云原生时代的一站式开发革命:当JavaAI遇上Kubernetes 在数字化转型的浪潮中,微服务架构已成为企业技术栈的标配,但随之而来的开发复杂度却让许多团队陷入"最后一公里"困境。传统开发流程中,从本地编码到云端部署需要跨…...

SEO_如何制定有效的SEO策略?分步指南(132 )

如何制定有效的SEO策略?分步指南 在互联网时代,一个网站的成功往往取决于其在搜索引擎上的排名。制定有效的SEO策略是提升网站流量、吸引潜在客户的关键。本文将为你提供一份详细的分步指南,帮助你制定并实施有效的SEO策略。 第一步&#x…...

Qwen3.5-9B镜像安全加固:非root用户运行+端口绑定限制+HTTPS代理配置

Qwen3.5-9B镜像安全加固:非root用户运行端口绑定限制HTTPS代理配置 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解(图文输入)和长上下文处理&a…...

Nginx从专家到小白

文章目录主要用途Nginx 本地路径映射 HTTP 服务搭建文档一、环境信息二、安装步骤2.1 下载 Nginx2.2 解压安装三、配置说明3.1 配置文件路径3.2 完整配置内容3.3 配置项说明四、常用命令4.1 启动 Nginx4.2 停止 Nginx4.3 重新加载配置4.4 查看进程状态4.5 查看端口监听4.6 测试…...

WarcraftHelper完全指南:从显示异常到性能飞跃的5个关键突破

WarcraftHelper完全指南:从显示异常到性能飞跃的5个关键突破 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 诊断宽屏适配问题 在34英寸2…...

个人电脑也能玩转大模型!Llama Factory+QLoRA微调实战,RTX4060即可运行

个人电脑也能玩转大模型!Llama FactoryQLoRA微调实战,RTX4060即可运行 你是不是也以为,训练一个属于自己的大语言模型,是那些拥有昂贵服务器和顶级显卡的大公司才能做的事?动辄几十GB的显存需求,让很多个人…...

Windows 上路由、端口转发配置

一、背景 有时候我们会遇到这样的场景,一批同一局域网中只有某一台主机带外且系统为windows,局域网中其他非带外的主机多是Linux,他们想要访问外网或外网连入管理,又不想新增公网资产增加成本,基于此,本文将介绍如何配置在带外主机上开启路由及端口转发。 关联资源:网络…...

Pandas :索引机制与数据访问

Pandas 的运行逻辑建立在索引对象之上。索引对象不仅用于显示标签,更承担“标签查找”的职责。所有基于标签的访问与运算,都会先经过索引对象完成查找与匹配,再进入数据区域。示例数据:import pandas as pd df pd.DataFrame({ …...

开源项目 Homelab 使用教程

开源项目 Homelab 使用教程 项目介绍 Homelab 是一个开源项目,旨在帮助用户构建和管理自己的家庭实验室。该项目提供了一套完整的工具和配置,使用户能够轻松地部署和管理各种服务和应用。Homelab 项目由 khuedoan 开发,基于 Kubernetes 和其他…...

VideoAgentTrek-ScreenFilter开发环境配置:从零开始搭建Java调用示例

VideoAgentTrek-ScreenFilter开发环境配置:从零开始搭建Java调用示例 如果你是一名Java开发者,最近听说了VideoAgentTrek-ScreenFilter这个视频处理服务,想在自己的项目里试试看,但不知道从哪儿下手,那这篇文章就是为…...

抖音无水印视频下载终极方案:DouYinBot完整使用指南

抖音无水印视频下载终极方案:DouYinBot完整使用指南 【免费下载链接】DouYinBot 抖音无水印下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 还在为抖音视频上的水印烦恼吗?想要收藏喜欢的视频却总是被平台限制困扰?DouY…...

Pandas 操作指南(一):DataFrame 的构建与表格数据组织

在数据分析与数据处理中,原始数据往往并不是一开始就以规范表格的形式出现。它可能来自列表(list)、字典(dict)、CSV/Excel 文件,或程序运行过程中临时生成的数据集合。若这些数据尚未被整理为结构明确的表…...

Phi-3-mini-4k-instruct-gguf辅助前端开发:基于VSCode的智能代码补全实践

Phi-3-mini-4k-instruct-gguf辅助前端开发:基于VSCode的智能代码补全实践 1. 引言:当AI遇见前端开发 最近在写前端代码时,我经常遇到这样的情况:明明知道要实现什么功能,却卡在具体语法细节上;或者反复写…...

万象视界灵坛应用场景:智能安防视频截图分析——自动识别‘是否含未授权人员/危险物品/异常行为’语义

万象视界灵坛在智能安防中的应用:自动识别异常语义分析 1. 智能安防的痛点与解决方案 传统安防监控系统面临三大核心挑战: 人力成本高:需要专人24小时盯守监控画面反应滞后:异常事件往往事后才发现漏检率高:人工监控…...

Wallpaper Engine下载器革新:突破创意工坊壁纸获取瓶颈的高效解决方案

Wallpaper Engine下载器革新:突破创意工坊壁纸获取瓶颈的高效解决方案 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 你是否曾因Steam创意工坊复杂的下载流程而放弃心仪的动态…...

Qwen3.5-9B-AWQ-4bit效果展示:多行表格截图→结构化JSON输出+中文摘要双模式

Qwen3.5-9B-AWQ-4bit效果展示:多行表格截图→结构化JSON输出中文摘要双模式 1. 模型能力惊艳展示 千问3.5-9B-AWQ-4bit作为一款支持图像理解的多模态模型,在处理表格类图片时展现出令人印象深刻的能力。它不仅能够准确识别表格内容,还能提供…...

CLIP-GmP-ViT-L-14GPU算力适配:ViT-L模型显存占用分析与推理加速实践

CLIP-GmP-ViT-L-14 GPU算力适配:ViT-L模型显存占用分析与推理加速实践 1. 引言 当你拿到一个像 CLIP-GmP-ViT-L-14 这样强大的视觉-语言模型时,第一反应可能是兴奋——它拥有接近90%的ImageNet准确率,能精准理解图片和文字的关系。但当你尝…...

ChatGLM3-6B Streamlit应用案例:代码辅助、长文档摘要、闲聊三合一

ChatGLM3-6B Streamlit应用案例:代码辅助、长文档摘要、闲聊三合一 1. 项目简介:你的本地全能AI助手 想象一下,你正在写一段复杂的代码,卡在某个逻辑上;或者面对一份几十页的技术文档,需要快速提炼核心&a…...

电商智能客服:基于Qwen3-VL:30B的多模态问答系统实现

电商智能客服:基于Qwen3-VL:30B的多模态问答系统实现 1. 引言 电商客服每天面对海量咨询,从"这件衣服有没有M码"到"这个电器怎么安装",问题五花八门。传统客服需要不停切换商品页面、说明书、物流信息,忙得…...

Doorkeeper与Active Storage集成终极指南:如何为OAuth认证系统添加文件上传功能 [特殊字符]

Doorkeeper与Active Storage集成终极指南:如何为OAuth认证系统添加文件上传功能 🚀 【免费下载链接】doorkeeper Doorkeeper is an OAuth 2 provider for Ruby on Rails / Grape. 项目地址: https://gitcode.com/gh_mirrors/do/doorkeeper Doorke…...

PyTorch 2.8镜像开发者案例:独立开发者打造个人AI视频工作室技术栈

PyTorch 2.8镜像开发者案例:独立开发者打造个人AI视频工作室技术栈 1. 从零搭建AI视频工作室的技术选择 作为一名独立开发者,我一直在寻找能够支撑个人AI视频创作的技术方案。经过多次尝试,最终选择了基于PyTorch 2.8的深度学习镜像作为核心…...

Phi-4-mini-reasoning低成本部署:8GB显存即可运行的高性能推理模型

Phi-4-mini-reasoning低成本部署:8GB显存即可运行的高性能推理模型 1. 模型介绍 Phi-4-mini-reasoning 是一款专注于推理任务的文本生成模型,特别适合处理数学题、逻辑题、多步分析和简洁结论输出等场景。与通用聊天模型不同,它采用了"…...

从零到精通:Logisim-evolution数字电路设计完全指南

从零到精通:Logisim-evolution数字电路设计完全指南 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 想要掌握数字电路设计的精髓,却苦于找不到合适…...

文墨共鸣大模型在网络安全领域的应用:模拟攻击脚本分析与安全报告撰写

文墨共鸣大模型在网络安全领域的应用:模拟攻击脚本分析与安全报告撰写 最近和几个做安全的朋友聊天,他们都在抱怨同一个问题:每天面对海量的告警日志和五花八门的攻击脚本,分析起来耗时费力,写报告更是头疼。技术细节…...