import os
from pathlib import Path
import openai
import yaml
from flask import Flask, redirect, render_template, request, url_for
# 通过 yaml 配置文件获取 openai 配置
conf_path = Path(__file__).parent.joinpath('conf/dev.yaml')
with open(conf_path) as f:
conf: dict = yaml.safe_load(f)
# 通过环境变量设置 openai 的 token 和代理地址
os.environ["OPENAI_API_KEY"] = conf.get("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = conf.get("OPENAI_BASE_URL")
通过变量message记录和大模型的历史交互信息。
# 发送的历史消息
messages = []
从前端获取到用户的输入信息,并将从大模型获取到的响应展示到界面上。- 如果是第一次,则使用预制的prompt。- 不是第一次,则接受响应信息。
# 创建 flask 实例
app = Flask(__name__)
# 定义路由
@app.route("/", methods=("GET", "POST"))
def index():
if request.method == "POST":
# 获取前端的用户输入信息
user_msg = request.form["msg"]
# 定义要发送给 openai 接口的信息
if messages:
# 有上下文历史
messages.append({
'role': 'user',
# 把用户输入的信息直接发给 openai
'content': user_msg
})
else:
# 第一次初始化
messages.append({
'role': 'user',
# 把最初的提示词发送给 openai
'content': generate_prompt(user_msg)
})
# 打印创建好的信息
print(f"messages: {messages}")
# 调用 openai 自带的方法,向 openai 服务器发出请求,并获取响应
response = openai.chat.completions.create(
model='gpt-3.5-turbo',
messages=messages,
temperature=0
)
# 从响应内容中提取 openai 回复的内容
answer = response.choices[0].message.content
# 打印回复内容
print(f"answer: {answer}")
# 刷新首页,返回答案信息
# result 参数会拼接在 index 视图函数对应路由的后方
# http://xx/?result=xxx
return redirect(url_for("index", result=answer))
# 获取拼接在 url 中的 result 参数的值,如果没有携带 result,则 result 值为空
result = request.args.get("result")
print(f"result = {result}")
# 第一次进入首页,result 为空,输入框上方不显示内容
return render_template("index.html", result=result)
def generate_prompt(msg):
# 定义提示词
prompt_msg = f"""你是一名软件测试工程师,你了解软件测试的技术与经验,你需要面试应聘者。
我是应聘者,你会问我这个职位的面试问题。
我希望你只以面试官的身份回答,一次只问一个问题,问我问题并等待我的回答。
当我说结束面试的时候给出我的面试表现的评价和我的改进方向。
我的输入是 {msg}
"""
# 返回提示词
return prompt_msg
启动服务
if __name__ == '__main__':
app.run(debug=True)
评论