当前位置:   article > 正文

通义千问大模型之 Function call 实战_通义千问 function call

通义千问 function call

Function call的工作流程示意图如下所示:

代码示例如下:

  1. from dashscope import Generation
  2. from datetime import datetime
  3. import random
  4. import json
  5. import requests
  6. # 定义工具列表,模型在选择使用哪个工具时会参考工具的name和description
  7. tools = [
  8. # 工具1 获取当前时刻的时间
  9. {
  10. "type": "function",
  11. "function": {
  12. "name": "get_current_time",
  13. "description": "当你想知道现在的时间时非常有用。",
  14. "parameters": {} # 因为获取当前时间无需输入参数,因此parameters为空字典
  15. }
  16. },
  17. # 工具2 获取指定城市的天气
  18. {
  19. "type": "function",
  20. "function": {
  21. "name": "get_current_weather",
  22. "description": "当你想查询指定城市的天气时非常有用。",
  23. "parameters": { # 查询天气时需要提供位置,因此参数设置为location
  24. "type": "object",
  25. "properties": {
  26. "location": {
  27. "type": "string",
  28. "description": "城市或县区,比如北京市、杭州市、余杭区等。"
  29. }
  30. }
  31. },
  32. "required": [
  33. "location"
  34. ]
  35. }
  36. }
  37. ]
  38. # 基于外部网站的天气查询工具。返回结果示例:{"location": "\u5317\u4eac\u5e02", "weather": "clear sky", "temperature": 17.94}
  39. def get_current_weather(location):
  40. api_key = "9fa42a532a9338bf217afd7ac47a565a" # 替换为你自己的OpenWeatherMap API密钥,用我的也无所谓啦,反正免费。
  41. url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}&units=metric"
  42. response = requests.get(url)
  43. if response.status_code == 200:
  44. data = response.json()
  45. weather = data["weather"][0]["description"]
  46. temp = data["main"]["temp"]
  47. return json.dumps({"location": location, "weather": weather, "temperature": temp})
  48. else:
  49. return json.dumps({"location": location, "error": "Unable to fetch weather data"})
  50. # 查询当前时间的工具。返回结果示例:“当前时间:2024-04-15 17:15:18。“
  51. def get_current_time():
  52. # 获取当前日期和时间
  53. current_datetime = datetime.now()
  54. # 格式化当前日期和时间
  55. formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
  56. # 返回格式化后的当前时间
  57. return f"当前时间:{formatted_time}。"
  58. # 封装模型响应函数
  59. def get_response(messages):
  60. response = Generation.call(
  61. model='qwen-plus',
  62. messages=messages,
  63. tools=tools,
  64. seed=random.randint(1, 10000), # 设置随机数种子seed,如果没有设置,则随机数种子默认为1234
  65. result_format='message' # 将输出设置为message形式
  66. )
  67. return response
  68. def call_with_messages():
  69. print('\n')
  70. messages = [
  71. {
  72. "content": input('请输入:'), # 提问示例:"现在几点了?" "一个小时后几点" "北京天气如何?"
  73. "role": "user"
  74. }
  75. ]
  76. # 模型的第一轮调用
  77. first_response = get_response(messages)
  78. assistant_output = first_response.output.choices[0].message
  79. print(f"\n大模型第一轮输出信息:{first_response}\n")
  80. messages.append(assistant_output)
  81. if 'tool_calls' not in assistant_output: # 如果模型判断无需调用工具,则将assistant的回复直接打印出来,无需进行模型的第二轮调用
  82. print(f"最终答案:{assistant_output.content}")
  83. return
  84. # 如果模型选择的工具是get_current_weather
  85. elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_weather':
  86. tool_info = {"name": "get_current_weather", "role":"tool"}
  87. location = json.loads(assistant_output.tool_calls[0]['function']['arguments'])['properties']['location']['description']
  88. # print(location)
  89. tool_info['content'] = get_current_weather(location)
  90. # 如果模型选择的工具是get_current_time
  91. elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_time':
  92. tool_info = {"name": "get_current_time", "role":"tool"}
  93. tool_info['content'] = get_current_time()
  94. print(f"工具输出信息:{tool_info['content']}\n")
  95. messages.append(tool_info)
  96. # 模型的第二轮调用,对工具的输出进行总结
  97. second_response = get_response(messages)
  98. print(f"大模型第二轮输出信息:{second_response}\n")
  99. print(f"最终答案:{second_response.output.choices[0].message['content']}")
  100. if __name__ == '__main__':
  101. call_with_messages()

运行输出:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号