call.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # coding=utf-8
  2. import requests
  3. import json
  4. import os
  5. from dotenv import load_dotenv
  6. from functions.basic_function import get_document_by_keyword,get_chunk_by_keyword,get_weather_by_city
  7. # 加载环境变量
  8. load_dotenv()
  9. print(os.getenv("DEEPSEEK_API_KEY"))
  10. DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
  11. DEEPSEEK_API_URL = os.getenv("DEEPSEEK_API_URL")
  12. def generate_response_with_function_call(functions, user_input):
  13. print(">>> generate_response_with_function_call")
  14. messages = []
  15. messages.append({"role": "system", "content": '''
  16. 你需要理解用户的意图,选择合适的功能,并给出参数。
  17. 如果用户的描述不明确,请要求用户提供必要信息'''})
  18. for text in user_input:
  19. messages.append({"role": "user", "content": text})
  20. headers = {
  21. "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
  22. "Content-Type": "application/json; charset=utf-8"
  23. }
  24. data = {
  25. "model": "Pro/deepseek-ai/DeepSeek-V3", #deepseek-ai/DeepSeek-V3",
  26. "messages": messages,
  27. "temperature": 0.7,
  28. "max_tokens": 2000,
  29. "tools":functions,
  30. "tool_choice": "auto",
  31. "stream": False
  32. }
  33. print(data)
  34. response = requests.post(DEEPSEEK_API_URL, json=data, headers=headers)
  35. response.raise_for_status()
  36. response = response.json()
  37. print(">"*30)
  38. del headers
  39. del data
  40. return response
  41. '''
  42. {'id': '01951cb08af7038b211056325775cf0c',
  43. 'object': 'chat.completion',
  44. 'created': 1739943086,
  45. 'model': 'Pro/deepseek-ai/DeepSeek-V3',
  46. 'choices': [
  47. {'index': 0,
  48. 'message': {
  49. 'role': 'assistant',
  50. 'content': '',
  51. 'tool_calls': [
  52. {'id': '01951cb097e5fe2f49765ac621ad6758',
  53. 'type': 'function',
  54. 'function': {'name': 'get_chunk_by_keyword',
  55. 'arguments': '{"keywords":"银行 销售 保险产品"}'}}]},
  56. 'finish_reason': 'tool_calls'}],
  57. 'usage': {'prompt_tokens': 252, 'completion_tokens': 40, 'total_tokens': 292},
  58. 'system_fingerprint': ''}
  59. '''
  60. def parse_function_call(model_response, messages):
  61. # 处理函数调用结果,根据模型返回参数,调用对应的函数。
  62. # 调用函数返回结果后构造tool message,再次调用模型,将函数结果输入模型
  63. # 模型会将函数调用结果以自然语言格式返回给用户。
  64. if 'tool_calls' in model_response['choices'][0]['message'].keys():
  65. tool_call = model_response['choices'][0]['message']['tool_calls'][0]
  66. args = tool_call['function']['arguments']
  67. function_result = {}
  68. function_name = tool_call['function']['name']
  69. print(f">>> call {function_name} with args: {args}")
  70. if function_name == "get_document_by_keyword":
  71. args_json = json.loads(args)
  72. function_result = get_document_by_keyword(args_json['keywords'])
  73. if function_name == "get_chunk_by_keyword":
  74. args_json = json.loads(args)
  75. function_result = get_chunk_by_keyword(args_json['keywords'])
  76. if function_name == "get_weather_by_city":
  77. args_json = json.loads(args)
  78. function_result = get_weather_by_city(args_json['keywords'])
  79. # messages.append({
  80. # "role": "tool",
  81. # "content": f"{json.dumps(function_result)}",
  82. # "tool_call_id":tool_call['id']
  83. # })
  84. return {"result": function_result}
  85. return {"result": ""}
  86. #print(response.choices[0].message)
  87. #messages.append(response.choices[0].message.model_dump())