LangChain4j: 如何让大模型知道当前日期(@Tool 实现 function call)

吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭,考验耐力与毅力,每有所进,心甚喜之。

 
吾以为,编程似布阵,算法如谋略,需精心筹谋,方可成就佳作。篮球乃团队之艺,协作共进,方显力量。跑步与马拉松,乃磨炼身心之途,愈挫愈勇,方能达至远方。愿交志同道合之友,共探此诸般妙趣。

诸君,此文尚佳,望点赞收藏,谢之!

 

package dev.langchain4j.example.aiservice;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.spring.AiService;

@AiService
interface Assistant {

    @SystemMessage("你是一个nlp专家,请帮忙提取以下内容中的时间、事件。"
            + "例如:以下内容“提醒我,这个月15号下午三点要和邻居打麻将”,输出结果应该是:时间:2024-07-15 15:00:00,事件:和邻居打麻将。"
            + "如果提取的结果中没有时间或事件,则询问用户相关信息。要根据今天的时间推理出提取到的时间的日期")
    String chat(String userMessage);
}

 

package dev.langchain4j.example.aiservice;

import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
class AssistantTools {

    /*
### LangChain4J Function Call 调用 Bean 的解决方案 在使用 LangChain4J 实现 Agent 和 Tool 调用的过程中,如果遇到 `FunctionCall` 无法调用 Bean 的问题,通常是因为以下几个原因导致的: #### 可能的原因分析 1. **Bean 注册未正确配置** 如果目标 Bean 没有被 Spring 容器成功注册,则即使通过 `@Autowired` 或其他方式尝试注入该 Bean,在运行时也会报错。这可能涉及组件扫描路径设置错误或者 Bean 配置类缺失的情况[^1]。 2. **函数签名不匹配** 当定义工具方法(即 Tools 方法)时,其参数列表或返回值类型未能满足 LLM 所需的标准 JSON Schema 格式化需求,可能导致解析失败并引发异常。 3. **上下文中缺少必要依赖项** 在某些复杂场景下,LangChain4J 中用于管理状态的对象(如 ContextManager),如果没有正确初始化所需的外部服务实例(Beans),也可能造成调用链断裂。 #### 解决方案详解 ##### 一、确认 Bean 是否已加载到容器中 确保所有需要用到的服务都已经被声明为 Spring 组件,并且项目启动过程中能够正常加载这些组件。可以通过以下方式进行排查: - 添加日志打印来验证特定 Beans 是否存在; - 使用调试模式查看 ApplicationContext 下的所有可用 beans 列表。 示例代码如下所示: ```java import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @Component public class BeanChecker { private final ApplicationContext applicationContext; public BeanChecker(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void checkIfBeanExists(String beanName){ boolean exists = applicationContext.containsBean(beanName); System.out.println("Does the '" + beanName + "' exist? -> " + (exists ? "Yes":"No")); } } ``` ##### 二、调整 Functions 的设计以适配 JSON Schema 对于每一个自定义 tool 函数来说,都需要提供清晰明了的输入输出描述信息以便于模型理解它们的功能用途以及数据交互形式。具体做法可以参照官方文档中的最佳实践指南来进行改造优化。 例如下面这个例子展示了如何构建一个兼容性强的操作数据库记录更新操作API接口: ```json { "name": "updateRecord", "description": "Update an existing record in database.", "parameters": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "id": {"type": "integer", "description": "The ID of the target entry"}, "newData": {"type": "string", "description": "Updated content"} }, "required":["id","newData"] } } ``` ##### 三、增强 Application Configuration 设置 最后一步就是加强应用层面的整体架构支持度,使得整个流程更加流畅稳定可靠。比如引入缓存机制减少重复计算开销;或是利用 AOP 技术拦截请求前后的处理逻辑等等措施都可以有效提升系统的健壮性和用户体验感。 --- ### 总结 综上所述,针对 LangChain4J 中出现的 `FunctionCall` 无法调用 Bean 的情况,可以从以上三个方面逐一检查定位根本原因所在,并采取相应的改进策略加以修复完善。希望上述建议对你有所帮助!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值