0


基于python实现openai可结合上下文的问答,含html在线版

本文使用 OpenAI GPT(Generative Pre-Training)聊天机器人模型,实现可自动回复提问的聊天功能。

代码解释

首先,我们导入相关的库,例如

  1. openai

  1. Path

  1. time

等。

接下来,为了使模型可以正常工作,我们需要设置

  1. openai

  1. api_key

,以及一些初始变量,如

  1. text

,

  1. turns

,

  1. last_result

,用来记录聊天记录。

之后,我们定义了一个函数

  1. chatgpt

,目的是为了接收用户输入的问题,并返回 GPT 模型生成的回答。函数中,除了指定使用

  1. davinci-003

模型外,我们还设置了

  1. temperature

  1. max_tokens

  1. frequency_penalty

  1. presence_penalty

等参数,用来控制结果的随机性和字数,以达到最佳的回答效果。

最后,在

  1. if __name__ == '__main__':

下,我们初始化两个列表,用来存放用户输入的问题和 GPT 模型自动生成的回答,然后在

  1. while

循环中,接收用户输入的问题,并调用

  1. chatgpt

函数,最后将问题和回答分别存储到对应的列表中,最终将内容保存到文件中。

代码使用说明

  • 使用该代码,你需要先申请 OpenAI 的api_key,并将其输入到代码中,然后运行该程序,
  • 输入你的问题,即可获得 GPT 模型的回答;
  • 若输入exit则直接退出当前对话;
  • 程序结束时,会将问答的内容记录到文件中,以便下次查看。

ini配置文件

在目录下创建

  1. config.ini

文件,内容如下

  1. [openai]
  2. ai_account_key = sk-AsqirFnBSHKvalmEe1AnT3BlbkFJe2rX0xxxxxxxxxxx

对话模式代码

点击查看代码

  1. import openai
  2. from pathlib import Path
  3. import time
  4. import configparser
  5. ANSI_COLOR_GREEN = "\x1b[32m"
  6. ANSI_COLOR_RESET = "\x1b[0m"
  7. # 从ini文件中读取api_key
  8. config = configparser.ConfigParser()
  9. config.read('config.ini')
  10. openai.api_key = config['openai']['ai_account_key']
  11. text = "" # 设置一个字符串变量
  12. turns = [] # 设置一个列表变量,turn指对话时的话轮
  13. last_result = ""
  14. def chatgpt(question):
  15. global text
  16. global turns
  17. global last_result
  18. prompt = text + "\nHuman: " + question
  19. try:
  20. response = openai.Completion.create(
  21. model="text-davinci-003", # 这里我们使用的是davinci-003的模型,准确度更高。
  22. prompt=prompt, # 你输入的问题
  23. temperature=0.9, # 控制结果的随机性,如果希望结果更有创意可以尝试 0.9,或者希望有固定结果可以尝试 0.0
  24. max_tokens=2048, # 这里限制的是回答的长度,你可以可以限制字数,如:写一个300字作文等。
  25. top_p=1,
  26. # [控制字符的重复度] -2.0 ~ 2.0 之间的数字,正值会根据新 tokens 在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性
  27. frequency_penalty=0,
  28. # [控制主题的重复度] -2.0 ~ 2.0 之间的数字,正值会根据到目前为止是否出现在文本中来惩罚新 tokens,从而增加模型谈论新主题的可能性
  29. presence_penalty=0
  30. )
  31. result = response["choices"][0]["text"].strip()
  32. last_result = result
  33. turns += [question] + [result] # 只有这样迭代才能连续提问理解上下文
  34. if len(turns) <= 10: # 为了防止超过字数限制程序会爆掉,所以提交的话轮语境为10次。
  35. text = " ".join(turns)
  36. else:
  37. text = " ".join(turns[-10:])
  38. return result
  39. except Exception as exc: # 捕获异常后打印出来
  40. print(exc)
  41. if __name__ == '__main__':
  42. # 将问题和回复记录下来,待结束后保存到文件中
  43. question_list = []
  44. answer_list = []
  45. while True:
  46. question = input(ANSI_COLOR_GREEN +
  47. "\n请输入问题,若输入exit退出\n" + ANSI_COLOR_RESET)
  48. question_list.append(question)
  49. if question == "exit":
  50. break
  51. answer = chatgpt(question)
  52. answer_list.append(answer)
  53. print("AI: " + answer)
  54. # 保存到文件中
  55. timestamp = time.strftime("%Y%m%d-%H%M-%S", time.localtime())
  56. file_name = 'output/chat ' + timestamp + '.md'
  57. f = Path(file_name)
  58. f.parent.mkdir(parents=True, exist_ok=True)
  59. with open(file_name, "w", encoding="utf-8") as f:
  60. for q, a in zip(question_list, answer_list):
  61. f.write(f"question: {q}\nanswer: {a}\n\n")
  62. print(ANSI_COLOR_GREEN + "对话内容已保存到文件中: " + file_name + ANSI_COLOR_RESET)

单问答模式代码

点击查看代码

  1. import openai
  2. from pathlib import Path
  3. import time
  4. import configparser
  5. ANSI_COLOR_GREEN = "\x1b[32m"
  6. ANSI_COLOR_RESET = "\x1b[0m"
  7. def get_ai_answer(prompt, save=True):
  8. # 去除字符串前后的空白符
  9. prompt = prompt.strip()
  10. # 发起请求
  11. if len(prompt) != 0:
  12. print(f'已发起请求,问题描述{len(prompt)}个长度,请稍等...')
  13. # 从ini文件中读取api_key
  14. config = configparser.ConfigParser()
  15. config.read('config.ini')
  16. openai.api_key = config['openai']['ai_account_key']
  17. # Get my answer
  18. response = openai.Completion.create(
  19. prompt=prompt,
  20. model="text-davinci-003",
  21. temperature=0.9,
  22. max_tokens=2048, #返回结果的长度
  23. top_p=1,
  24. frequency_penalty=0.0,
  25. presence_penalty=0.0)
  26. # Print my answer
  27. # print(response)
  28. answer = response["choices"][0]["text"].strip()
  29. print(answer)
  30. # 将内容写到以时间戳为名的md文件
  31. if save:
  32. timestamp = time.strftime("%Y%m%d-%H%M-%S", time.localtime())
  33. file_name = 'output/' + timestamp + '.md'
  34. f = Path(file_name)
  35. f.parent.mkdir(parents=True, exist_ok=True)
  36. text = f'# Q\n{prompt}\n# A\n{answer}\n'
  37. f.write_text(text, encoding='utf-8')
  38. print(ANSI_COLOR_GREEN +"对话内容已保存到文件中: " + file_name + ANSI_COLOR_RESET)
  39. return answer
  40. if __name__ == '__main__':
  41. prompt = '''
  42. 你今年几岁了
  43. '''
  44. get_ai_answer(prompt)

gitee在线版

此外,我用html写了一个可直接对话的openai gpt3在线版,用该页面需要提前自备openai的apikey。

项目源码https://gitee.com/x223222981/chat-gpt.js


本文转载自: https://blog.csdn.net/weixin_42063567/article/details/129085186
版权归原作者 dapenson 所有, 如有侵权,请联系我们删除。

“基于python实现openai可结合上下文的问答,含html在线版”的评论:

还没有评论