效果图
数据库记录:
流式输出就不展示了
准备工作
前往阿里云大模型服务平台使用自己账号开通大模型服务平台百炼
地址:大模型服务平台_通义大模型_自然语言处理_达摩院-阿里云 (aliyun.com)
1.进入自己的控制台--模型广场--通义千问--找到自己要使用的模型 我这里使用通义千问Max
一般是有免费额度可以使用的 后期可以自己买额度 很便宜
然后到我的应用 创建好自己的应用 选择相应的模型 这时我们就哟APIkey和 自己的appid了
2.在自己电脑安装好Redis (用于存储聊天缓存) 如果使用服务器就在服务器安装好并运行就行
3.安装好mysql数据库 推荐使用5.7版本
实施
创建一个Python Flask项目并创建好虚拟环境解释器使用python3.8 项目结构如下图所示
key.py及其下方文件为我个人测试部署时使用 可以忽略
app.py
运行项目的文件 也就是后端
# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify, Response, render_template, session
from flask_session import Session
from dashscope import Generation
from http import HTTPStatus
from flask_cors import CORS
import redis
import json
from database import save_conversation
app = Flask(__name__)
CORS(app)
#可以自己生成一串
app.secret_key = '3ddd8f0da764cb34850e1da48d03da24'
# 配置 Redis
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='localhost', port=6379)
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_USE_SIGNER'] = True
Session(app)
@app.route('/ChatView')
def index():
return render_template('index.html')
@app.route('/chat', methods=['POST'])
def chat():
user_message = request.json.get('message', '')
if not user_message:
return jsonify({'error': '未提供消息'}), HTTPStatus.BAD_REQUEST
# 从会话中加载消息或初始化一个新列表 可以自己自定义角色 修改'你是一个ai助手'内容就行
messages = session.get('messages', [{'role': 'system', 'content': '你是一个ai助手'}])
# 将用户的消息添加到列表中
messages.append({'role': 'user', 'content': user_message})
session['messages'] = messages # 在添加用户消息后立即保存
def generate():
responses = Generation.call(
"qwen-max",
app_id='自己的应用id',
api_key='自己的api key',
messages=messages,
result_format='message',
stream=True,
incremental_output=True
)
buffer = ''
for response in responses:
if response.status_code == HTTPStatus.OK:
content = response.output.choices[0]['message']['content'].strip()
print(content)
buffer += content
yield f"{content}"
else:
yield f"Error: {response.message}\n\n"
break
return Response(generate(), mimetype='text/event-stream')
@app.route('/update', methods=['POST'])
def update():
try:
data = request.json
bot_message = data.get('bot_message', '')
user_message = data.get('user_message', '')
conversation_id = data.get('conversation_id', '')
if not bot_message or not user_message or not conversation_id:
app.logger.error('Missing bot_message, user_message, or conversation_id')
return jsonify({'error': '未提供消息或对话ID'}), HTTPStatus.BAD_REQUEST
messages = session.get('messages', [])
messages.append({'role': 'assistant', 'content': bot_message})
session['messages'] = messages
save_conversation(conversation_id, user_message, bot_message) # 保存对话
return jsonify({'status': 'updated'}), HTTPStatus.OK
except Exception as e:
app.logger.error(f"Error in /update: {str(e)}")
return jsonify({'error': str(e)}), HTTPStatus.INTERNAL_SERVER_ERROR
@app.route('/clear', methods=['POST'])
def clear():
session.pop('messages', None)
return jsonify({'status': 'cleared'}), HTTPStatus.OK
if __name__ == '__main__':
app.run(debug=True)
# 这里是自定义本地运行的端口号和ip地址
# app.run(host='0.0.0.0', port=8080, debug=True)
database.py
指向数据库操作 保存记录的后端文件 需要修改为自己的数据库账户和密码
# -*- coding: utf-8 -*-
import mysql.connector
def get_db_connection():
return mysql.connector.connect(
host="localhost",
user="用户名",
password="密码",
database="数据库名"
)
def save_conversation(conversation_id, user_message, bot_message):
try:
connection = get_db_connection()
cursor = connection.cursor()
# 检查对话是否存在
conversation_query = "SELECT 1 FROM conversations WHERE conversation_id = %s"
cursor.execute(conversation_query, (conversation_id,))
conversation_exists = cursor.fetchone()
if not conversation_exists:
# 插入对话记录
conversation_query = """
INSERT INTO conversations (conversation_id)
VALUES (%s)
"""
cursor.execute(conversation_query, (conversation_id,))
# 插入聊天记录
chat_record_query = """
INSERT INTO chat_records (conversation_id, user_message, bot_message)
VALUES (%s, %s, %s)
"""
cursor.execute(chat_record_query, (conversation_id, user_message, bot_message))
connection.commit()
except mysql.connector.Error as err:
print(f"Error: {err}")
raise
finally:
if connection.is_connected():
cursor.close()
connection.close()
数据库结构 sql语句
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for chat_records
-- -------------------