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"}'
STEP2: 编写工具类我们先写一个工具类,用来给Langchain调用,获取某个城市的天气其中Tool注解里写的是这个工具能够解决什么问题public class WeatherToolsForLLM {@Tool("获取给定城市的天气情况")String getCurrentWeather(String cityName){return "leo说上海今天天气很好";}}
STEP3: 编写一个简单的聊天机器人注意,我们在使用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);}
STEP4: 跟踪代码,看看Langchain4j干了什么agent.chat(userId,chatMessage);
会调用DefaultAiServices类的invoke方法,最终会调用OpenAiChatModel.generate方法,这个方法在构建request的时候,会把工具类放入requestOpenAiChatModel.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 第二弹,爆款小红书内容生成Agentdify.ai 学习 case by case 第三弹,调用dify的API运行流程dify.ai 学习 case by case 第四弹,复杂的case:用dify生成一篇论文(图片来源网络,侵删)
0 评论