AI大模型-流式处理 (以百度接口为例)

沉心ss 2024-07-21 17:01:02 阅读 85

No bb , show code

效果

后端代码

<code>from flask import Flask, request, Response

import json

import requests

from flask_cors import CORS

app = Flask(__name__)

CORS(app) # Enable CORS for all routes

def get_access_token(ak, sk):

auth_url = "https://aip.baidubce.com/oauth/2.0/token"

resp = requests.get(auth_url, params={"grant_type": "client_credentials", "client_id": ak, 'client_secret': sk})

return resp.json().get("access_token")

def get_stream_response(prompt):

ak = "你的AK"

sk = "你的SK"

source = "&sourceVer=0.0.1&source=app_center&appName=streamDemo"

# ERNIE-Bot-turbo

base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant"

# ERNIE-Bot 4.0

# base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"

# base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/57wt8rb5b3kzhnrd"

url = base_url + "?access_token=" + get_access_token(ak, sk) + source

data = {

"messages": [{"role": "user", "content": prompt}],code>

"stream": True

}

payload = json.dumps(data)

headers = {'Content-Type': 'application/json'}

return requests.post(url, headers=headers, data=payload, stream=True)

def gen_stream(prompt):

response = get_stream_response(prompt)

for chunk in response.iter_lines():

chunk = chunk.decode("utf8")

if chunk[:5] == "data:":

chunk = chunk[5:]

yield chunk

@app.route('/eb_stream', methods=['POST'])

def eb_stream():

body = request.json

prompt = body.get("prompt")

return Response(gen_stream(prompt), mimetype='text/event-stream')code>

if __name__ == '__main__':

app.run(host='0.0.0.0', port=8000)code>

前端代码

<!DOCTYPE html>

<html lang="en">code>

<head>

<meta charset="UTF-8">code>

<title>Sample</title>

</head>

<body>

<label for="textInput">Prompt:</label>code>

<input type="textarea" id="textInput" placeholder="您有什么问题">code>

<button onclick="run_prompt()">执行prompt</button>code>

<p><textarea id="answer" rows="10" cols="50" readonly></textarea></p>code>

<script>

current_text = document.getElementById('answer');

text = "";

char_index = 0

function run_prompt() {

var inputValue = document.getElementById('textInput').value;

document.getElementById('answer').value = "";

// 调用服务端的流式接口, 修改为自己的服务器地址和端口号

fetch('http://127.0.0.1:8000/eb_stream', {

method: 'post',

headers: {'Content-Type': 'application/json'},

body: JSON.stringify({'prompt': inputValue})

})

.then(response => {

return response.body;

})

.then(body => {

const reader = body.getReader();

const decoder = new TextDecoder();

function read() {

return reader.read().then(({ done, value }) => {

if (done) { // 读取完成

return;

}

data = decoder.decode(value, { stream: true });

text += JSON.parse(data).result;

type(); // 打字机效果输出

return read();

});

}

return read();

})

.catch(error => {

console.error('发生错误:', error);

});

}

function type() {

let enableCursor = true; // 启用光标效果

if (char_index < text.length) {

let txt = document.getElementById('answer').value;

let cursor = enableCursor ? "|" : "";

if (enableCursor && txt.endsWith("|")) {

txt = txt.slice(0, -1);

}

document.getElementById('answer').value = txt + text.charAt(char_index) + cursor;

char_index++;

setTimeout(type, 1000/5); // 打字机速度控制, 每秒5个字

}

}

</script>

</body>

</html>



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。