Python Flask项目方式接入阿里云通义AI大模型API 实现一个简单的AI聊天Web项目(流式传输+多轮对话+会话记录+代码高亮)----- noob学生

效果图

数据库记录:

流式输出就不展示了

准备工作

 前往阿里云大模型服务平台使用自己账号开通大模型服务平台百炼 

地址:大模型服务平台_通义大模型_自然语言处理_达摩院-阿里云 (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
-- -------------------
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值