Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openai
|
| 2 |
+
import os
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
import gradio as gr
|
| 6 |
+
import openai
|
| 7 |
+
import backoff # for exponential backoff
|
| 8 |
+
from reportlab.lib.pagesizes import letter
|
| 9 |
+
from reportlab.lib import colors
|
| 10 |
+
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
|
| 11 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 12 |
+
from reportlab.lib.enums import TA_CENTER
|
| 13 |
+
|
| 14 |
+
openai.api_key = os.environ['chat_key']
|
| 15 |
+
|
| 16 |
+
class SessionManager:
|
| 17 |
+
def __init__(self):
|
| 18 |
+
self.sessions = {}
|
| 19 |
+
|
| 20 |
+
def add_message(self, session_id, message):
|
| 21 |
+
if session_id not in self.sessions:
|
| 22 |
+
self.sessions[session_id] = []
|
| 23 |
+
self.sessions[session_id].append(message)
|
| 24 |
+
|
| 25 |
+
def get_messages(self, session_id):
|
| 26 |
+
return self.sessions.get(session_id, [])
|
| 27 |
+
|
| 28 |
+
# 自定义一个函数,用于将对话消息整理为简短概要
|
| 29 |
+
def summarize_message(message):
|
| 30 |
+
# 在这个示例中,我们简单地返回原始消息。
|
| 31 |
+
# 你可以根据需要替换为更复杂的逻辑,以提取关键信息并生成简短概要。
|
| 32 |
+
return message
|
| 33 |
+
|
| 34 |
+
session_manager = SessionManager()
|
| 35 |
+
def chat_gpt(session_id, user_message, model="gpt-3.5-turbo", max_tokens=4096):
|
| 36 |
+
# 将用户消息添加到对应的会话中
|
| 37 |
+
summarized_message = summarize_message(f"User: {user_message}")
|
| 38 |
+
session_manager.add_message(session_id, summarized_message)
|
| 39 |
+
|
| 40 |
+
# 获取当前会话的消息列表
|
| 41 |
+
message_list = session_manager.get_messages(session_id)
|
| 42 |
+
|
| 43 |
+
# 组合聊天历史
|
| 44 |
+
conversation = "\n\n".join(message_list)
|
| 45 |
+
|
| 46 |
+
# 检查对话历史是否超过模型的token限制
|
| 47 |
+
tokens_length = len(conversation.split())
|
| 48 |
+
|
| 49 |
+
if tokens_length > max_tokens:
|
| 50 |
+
# 移除早期消息,直到满足token限制
|
| 51 |
+
while tokens_length > max_tokens:
|
| 52 |
+
message_list.pop(0)
|
| 53 |
+
conversation = "\n\n".join(message_list)
|
| 54 |
+
tokens_length = len(conversation.split())
|
| 55 |
+
|
| 56 |
+
# 生成聊天回复
|
| 57 |
+
response = openai.ChatCompletion.create(
|
| 58 |
+
model= model,
|
| 59 |
+
messages=[{"role": "system", "content": "你好,请问有什么问题我可以帮您解答吗?"}] +
|
| 60 |
+
[{"role": "user", "content": msg} for msg in message_list],
|
| 61 |
+
# system 中 定义回答问题的具体类型等
|
| 62 |
+
temperature=0.5,
|
| 63 |
+
max_tokens=150,
|
| 64 |
+
top_p=1,
|
| 65 |
+
frequency_penalty=0,
|
| 66 |
+
presence_penalty=0,
|
| 67 |
+
stop=["\n\n"],
|
| 68 |
+
)
|
| 69 |
+
assistant_response = response.choices[0].message.content
|
| 70 |
+
|
| 71 |
+
# 将助手回复添加到对应的会话中
|
| 72 |
+
summarized_message = summarize_message(f"Assistant: {assistant_response}")
|
| 73 |
+
session_manager.add_message(session_id, summarized_message)
|
| 74 |
+
|
| 75 |
+
return assistant_response
|
| 76 |
+
|
| 77 |
+
#示例
|
| 78 |
+
session_id = "session_1"
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def gradio_chat_gpt(input_text):
|
| 82 |
+
session_id = "gradio_session"
|
| 83 |
+
return chat_gpt(session_id, input_text)
|
| 84 |
+
|
| 85 |
+
input_text = gr.inputs.Textbox(lines=5, placeholder="请输入你的问题...")
|
| 86 |
+
output_text = gr.outputs.Textbox()
|
| 87 |
+
iface = gr.Interface(fn=gradio_chat_gpt, inputs=input_text, outputs=output_text, title="ChatGPT", description="与GPT模型聊天")
|
| 88 |
+
|
| 89 |
+
iface.launch()
|