记忆体的使用,参考我前面的文章:
本文手把手教你使用langchain4j编写一个能够使用工具的agent聊天机器人。
STEP0:基本环境准备和编程入门回顾,请参考我的AI文章系列AI编程之手把手教你使用langchain4j编写一个有记忆的聊天机器人

AI编程之手把手教你使用JAVA语言编写大模型RAG
AI编程之手把手教你使用langchain和postgresql向量库Python版
AI编程之手把手教你使用postgresql向量数据库建设知识库JAVA版
AI编程之手把手教你在CentOS安装Postgresql的Vector向量数据库
STEP1:选一个例子
下面是openai官网给出的一个例子,接下来我们模拟这个例子,调用chatgpt实现调用工具的例子。
curl https://api.openai.com/v1/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "gpt-4-turbo","messages": [{"role": "user","content": "What'\''s the weather like in Boston today?"}],"tools": [{"type": "function","function": {"name": "get_current_weather","description": "Get the current weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA"},"unit": {"type": "string","enum": ["celsius", "fahrenheit"]}},"required": ["location"]}}}],"tool_choice": "auto"}'
我们先写一个工具类,用来给Langchain调用,获取某个城市的天气。
其中Tool注解里写的是这个工具能够解决什么问题。
public class WeatherToolsForLLM {@Tool("获取给定城市的天气情况")String getCurrentWeather(String cityName){return "leo说上海今天天气很好";}}
注意,我们在使用AiServices构建agent的时候,传入了tools参数
public String chatWithTools(Integer userId,String chatMessage) {OpenAiChatModel chatModel = OpenAiChatModel.builder().baseUrl("https://xxx.xxx").apiKey("sk-1234567890abcdef").modelName("gpt-3.5-turbo").build();LLMAssistant agent = AiServices.builder(LLMAssistant.class).chatLanguageModel(chatModel).tools(new WeatherToolsForLLM())//注意这里.build();return agent.chat(userId,chatMessage);}
agent.chat(userId,chatMessage);
会调用
DefaultAiServices类的invoke方法,最终会调用OpenAiChatModel.generate方法,这个方法在构建request的时候,会把工具类放入request。
OpenAiChatModel.generate(List<ChatMessage> messages, List<ToolSpecification> toolSpecifications){…….if (toolSpecifications != null && !toolSpecifications.isEmpty()) {requestBuilder.tools(toTools(toolSpecifications));}……..}
我们看看request放入tools后变成什么样:
可以看到在tools列表里放入了function相关的描述。
STEP5: 跟踪代码,看看chatgpt怎么使用工具
把工具类放入request后,Langchain4j会发送一次请求。
chatgpt收到请求后,发现自己不知道上海现在的天气,于是查找工具列表,发现有一个工具可以获取给定城市的天气情况。
于是,chatgpt返回一个调用工具的响应。我们看一下响应内容:
可以看到response里,包含了一个ToolExecutionRequest,里面指明了要调用getCurrentWeather工具,且给定了参数cityName是ShangHai。
说明chatgpt理解了我给出的问题,并正确的给出调用工具请求。
STEP6: 跟踪代码,看看Langchain4j怎么使用工具
收到chatgpt的响应后,Langchain4j发现响应是一个使用工具的响应。Langchain4j就会调用这个工具。
然后把工具的输出,以及原始的问题放在一起,再次调用chatgpt。我们看一下第二次request的内容:
STEP7:看看最终的效果
使用Postman调用,看看效果:
STEP8: 后续
后续将使用Langchain和postgresql实现更多的CASE,敬请关注。
作者简介:
leo,互联网大厂AI架构师,欢迎微信、私信交流
我的Dify AI case by case系列文章:
dify.ai 学习 case by case 第一弹
dify.ai 学习 case by case 第二弹,爆款小红书内容生成Agent
dify.ai 学习 case by case 第三弹,调用dify的API运行流程
dify.ai 学习 case by case 第四弹,复杂的case:用dify生成一篇论文