基于python实现openai可结合上下文的问答,含html在线版
Posted dapenson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于python实现openai可结合上下文的问答,含html在线版相关的知识,希望对你有一定的参考价值。
本文使用 OpenAI GPT(Generative Pre-Training)聊天机器人模型,实现可自动回复提问的聊天功能。
代码解释
首先,我们导入相关的库,例如 openai
,Path
,time
等。
接下来,为了使模型可以正常工作,我们需要设置 openai
的 api_key
,以及一些初始变量,如 text
, turns
, last_result
,用来记录聊天记录。
之后,我们定义了一个函数 chatgpt
,目的是为了接收用户输入的问题,并返回 GPT 模型生成的回答。函数中,除了指定使用 davinci-003
模型外,我们还设置了 temperature
、max_tokens
、frequency_penalty
、presence_penalty
等参数,用来控制结果的随机性和字数,以达到最佳的回答效果。
最后,在 if __name__ == '__main__':
下,我们初始化两个列表,用来存放用户输入的问题和 GPT 模型自动生成的回答,然后在 while
循环中,接收用户输入的问题,并调用 chatgpt
函数,最后将问题和回答分别存储到对应的列表中,最终将内容保存到文件中。
代码使用说明
- 使用该代码,你需要先申请 OpenAI 的api_key,并将其输入到代码中,然后运行该程序,
- 输入你的问题,即可获得 GPT 模型的回答;
- 若输入exit则直接退出当前对话;
- 程序结束时,会将问答的内容记录到文件中,以便下次查看。
ini配置文件
在目录下创建config.ini
文件,内容如下
[openai]
ai_account_key = sk-AsqirFnBSHKvalmEe1AnT3BlbkFJe2rX0xxxxxxxxxxx
对话模式代码
点击查看代码import openai
from pathlib import Path
import time
import configparser
ANSI_COLOR_GREEN = "\\x1b[32m"
ANSI_COLOR_RESET = "\\x1b[0m"
# 从ini文件中读取api_key
config = configparser.ConfigParser()
config.read('config.ini')
openai.api_key = config['openai']['ai_account_key']
text = "" # 设置一个字符串变量
turns = [] # 设置一个列表变量,turn指对话时的话轮
last_result = ""
def chatgpt(question):
global text
global turns
global last_result
prompt = text + "\\nHuman: " + question
try:
response = openai.Completion.create(
model="text-davinci-003", # 这里我们使用的是davinci-003的模型,准确度更高。
prompt=prompt, # 你输入的问题
temperature=0.9, # 控制结果的随机性,如果希望结果更有创意可以尝试 0.9,或者希望有固定结果可以尝试 0.0
max_tokens=2048, # 这里限制的是回答的长度,你可以可以限制字数,如:写一个300字作文等。
top_p=1,
# [控制字符的重复度] -2.0 ~ 2.0 之间的数字,正值会根据新 tokens 在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性
frequency_penalty=0,
# [控制主题的重复度] -2.0 ~ 2.0 之间的数字,正值会根据到目前为止是否出现在文本中来惩罚新 tokens,从而增加模型谈论新主题的可能性
presence_penalty=0
)
result = response["choices"][0]["text"].strip()
last_result = result
turns += [question] + [result] # 只有这样迭代才能连续提问理解上下文
if len(turns) <= 10: # 为了防止超过字数限制程序会爆掉,所以提交的话轮语境为10次。
text = " ".join(turns)
else:
text = " ".join(turns[-10:])
return result
except Exception as exc: # 捕获异常后打印出来
print(exc)
if __name__ == '__main__':
# 将问题和回复记录下来,待结束后保存到文件中
question_list = []
answer_list = []
while True:
question = input(ANSI_COLOR_GREEN +
"\\n请输入问题,若输入exit退出\\n" + ANSI_COLOR_RESET)
question_list.append(question)
if question == "exit":
break
answer = chatgpt(question)
answer_list.append(answer)
print("AI: " + answer)
# 保存到文件中
timestamp = time.strftime("%Y%m%d-%H%M-%S", time.localtime())
file_name = 'output/chat ' + timestamp + '.md'
f = Path(file_name)
f.parent.mkdir(parents=True, exist_ok=True)
with open(file_name, "w", encoding="utf-8") as f:
for q, a in zip(question_list, answer_list):
f.write(f"question: q\\nanswer: a\\n\\n")
print(ANSI_COLOR_GREEN + "对话内容已保存到文件中: " + file_name + ANSI_COLOR_RESET)
单问答模式代码
点击查看代码import openai
from pathlib import Path
import time
import configparser
ANSI_COLOR_GREEN = "\\x1b[32m"
ANSI_COLOR_RESET = "\\x1b[0m"
def get_ai_answer(prompt, save=True):
# 去除字符串前后的空白符
prompt = prompt.strip()
# 发起请求
if len(prompt) != 0:
print(f'已发起请求,问题描述len(prompt)个长度,请稍等...')
# 从ini文件中读取api_key
config = configparser.ConfigParser()
config.read('config.ini')
openai.api_key = config['openai']['ai_account_key']
# Get my answer
response = openai.Completion.create(
prompt=prompt,
model="text-davinci-003",
temperature=0.9,
max_tokens=2048, #返回结果的长度
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.0)
# Print my answer
# print(response)
answer = response["choices"][0]["text"].strip()
print(answer)
# 将内容写到以时间戳为名的md文件
if save:
timestamp = time.strftime("%Y%m%d-%H%M-%S", time.localtime())
file_name = 'output/' + timestamp + '.md'
f = Path(file_name)
f.parent.mkdir(parents=True, exist_ok=True)
text = f'# Q\\nprompt\\n# A\\nanswer\\n'
f.write_text(text, encoding='utf-8')
print(ANSI_COLOR_GREEN +"对话内容已保存到文件中: " + file_name + ANSI_COLOR_RESET)
return answer
if __name__ == '__main__':
prompt = '''
你今年几岁了
'''
get_ai_answer(prompt)
gitee在线版
此外,我用html写了一个可直接对话的openai gpt3在线版,用该页面需要提前自备openai的apikey。
项目源码https://gitee.com/x223222981/chat-gpt.js
基于Python Tornado的在线问答系统
概述
详细
项目介绍:本项目最初是为了模仿StackOverflow的练手项目,实现了部分StackOverflow的功能。
项目说明:推荐使用Linux部署该项目,这样可以优化Tornado的性能。我的环境是Windows加Python3.6.5。
目录结构:
database:MySQL/Redis等异步连接器,数据操作方法。
handlers:Tornado控制器文件
static:静态文件地址
templats:html页面地址
utils:Python实用工具脚本
conf:配置文件
local_conf.bak.py:本地配置文件示例
manage.py:程序启动入口
require:依赖包,使用pip安装
router.py:路由
0:下载压缩包,将项目源文件解压到指定目录。我的目录是C:UserszhangDownloads equila-master equila-master>
1:在项目根目录创建venv虚拟环境,virtualenv venv --no-site-packages
2:激活虚拟环境 venvScriptsactivate
3:安装Python包依赖 pip install -r require
4:将local_conf.bak.py文件名修改为local_conf.py,并且编辑local_conf.py文件为如下内容:
# -*- coding: utf-8 -*- import os DOMAIN = ‘http://127.0.0.1:9000‘ DEFAULT_UPLOAD_PATH = os.path.join(os.path.dirname(__file__), ‘pics‘) DATABASE = { ‘default‘: { ‘host‘: ‘localhost‘, ‘port‘: 3306, ‘database‘: ‘tequila_demo‘, ‘user‘: ‘root‘, ‘password‘: ‘你的数据库密码‘, ‘charset‘: ‘utf8‘ } } REDIS = { ‘default‘: { ‘host‘: ‘localhost‘, ‘port‘: 6379, ‘password‘: ‘‘, ‘selected_db‘: 0, } }
5:创建数据库,create database tequila_demo;
6:执行脚本迁移,创建初始化数据。python manage.py migrate
7:查看数据表是否创建成功,并且检查redis是否可用
8:运行项目,python manage.py run,如果您的系统是windows,那将无法使用Tornado的fork进程模式,会遇到下面的错误:
这时不要惊慌,你只需要修改manage.py文件,将server.start(num_process=4)修改为server.start()即可
最后重新运行项目: python manage.py run
9:浏览器访问http://127.0.0.1:9000
以上是部分项目页面截图,如果对于项目有什么问题可以联系我~
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
以上是关于基于python实现openai可结合上下文的问答,含html在线版的主要内容,如果未能解决你的问题,请参考以下文章