chatgpt.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # -*- coding:utf-8 -*-
  2. if __name__ == '__main__':
  3. import os
  4. os.chdir("..")
  5. import requests
  6. import random
  7. import time
  8. from tools.loglog import logger,simple_logger
  9. from tools.new_mysql import MySQLUploader
  10. from typing import Optional, Dict, Any,Union
  11. m = MySQLUploader()
  12. def get_openai_model(model_text:str):
  13. """模糊获得模型名"""
  14. if "3.5" in model_text or "3.5-turbo" in model_text or "3.5turbo" in model_text:
  15. model = "gpt-3.5-turbo"
  16. elif "4o" in model_text or "gpt4o" in model_text:
  17. model = "gpt-4o"
  18. elif "4turbo" in model_text or "4-turbo" in model_text:
  19. model = "gpt-4-turbo"
  20. else:
  21. model = "gpt-4o"
  22. return model
  23. def insert_ip_token(ip,demo_name,gpt_content,prompt_tokens,completion_tokens,total_tokens):
  24. sql = "insert into consumer_token (ip,demo_name,gpt_content,prompt_tokens,completion_tokens,total_tokens) values (%s,%s,%s,%s,%s,%s)"
  25. m.execute_(sql,(ip,demo_name,str(gpt_content),prompt_tokens,completion_tokens,total_tokens))
  26. def get_answer_from_gpt(question,real_ip="localhost",demo_name="无",model="gpt-4o",max_tokens=3500,temperature:float=0,
  27. json_resp:Union[Dict[Any, Any],bool]=False,n=1,check_fucn=None,sys_prompt=None):
  28. model = get_openai_model(model)
  29. d2 = {"model": model,"messages": [],"max_tokens": max_tokens,"temperature": temperature,'n': n}
  30. if sys_prompt:
  31. d2['messages'].append({"role": "system", "content": sys_prompt})
  32. d2['messages'].append({"role": "user", "content": question})
  33. if json_resp is True:
  34. d2["response_format"] = {"type": "json_object"}
  35. elif json_resp is False:
  36. pass
  37. else:
  38. d2["response_format"] = json_resp
  39. for num_count in range(3):
  40. try:
  41. response = requests.post(f'http://170.106.108.95/v1/chat/completions', json=d2)
  42. r_json = response.json()
  43. if r2:= r_json.get("choices",None):
  44. if n>1:
  45. gpt_res = []
  46. for i in r2:
  47. gpt_res.append(i["message"]["content"])
  48. else:
  49. gpt_res= r2[0]["message"]["content"]
  50. gpt_content = str(gpt_res)
  51. prompt_tokens = r_json["usage"]["prompt_tokens"]
  52. completion_tokens = r_json["usage"]["completion_tokens"]
  53. total_tokens = r_json["usage"]["total_tokens"]
  54. insert_ip_token(real_ip,demo_name,gpt_content,prompt_tokens,completion_tokens,total_tokens)
  55. simple_logger.info(f"问题日志:\n{question}\n回答日志:\n{gpt_res}")
  56. if not check_fucn:
  57. return gpt_res
  58. check_result = check_fucn(str(gpt_res))
  59. if check_result:
  60. return gpt_res
  61. else:
  62. raise Exception(f"第{num_count+1}次共3次,GPT的校验没有通过,校验函数:{check_fucn.__name__}")
  63. elif r_json.get("message") == "IP address blocked":
  64. print("IP address blocked")
  65. raise Exception("IP address blocked")
  66. else:
  67. print(f"小错误:{question[:10]}")
  68. logger.error(response.text)
  69. except Exception as e:
  70. logger.info(f"小报错忽略{e}")
  71. time.sleep(10)
  72. logger.critical("get_answer_from_gpt 严重错误,3次后都失败了")
  73. def parse_gpt_phon_to_tuplelist(text:str) -> list:
  74. """解析gpt返回的音标数据"""
  75. result = []
  76. if not text:
  77. return []
  78. for i in text.split("\n"):
  79. ii = i.split("***")
  80. if len(ii)>=3:
  81. result.append((ii[0].strip(),ii[1].strip(),ii[2].strip()))
  82. return result
  83. if __name__ == '__main__':
  84. question = "hello"
  85. print(get_answer_from_gpt(question,temperature=0.8))