浅谈人工智能之大模型的流式调用:Python版
前言
在深度学习和自然语言处理领域,大模型的应用日益广泛,它们能够处理更复杂、更精细的任务,但同时也带来了计算资源和内存占用的挑战。为了有效利用资源并实时响应用户请求,流式调用成为了一种重要的技术手段。本文将分为两部分,分别介绍纯后端版本和前后端结合版本的流式调用实现方法。
纯后端版本:使用Python进行流式调用
在纯后端场景下,我们通常使用Python来开发服务端应用,直接处理大模型的流式调用。以下是一个基于千问大模型作为实例,展示如何使用OpenAI库进行流式文本生成。
# coding:utf-8
from openai import OpenAI
openai_api_base = "http://XX.XX.XX.XX:8889/v1"
openai_api_key = "none"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
response = client.chat.completions.create(
model="QWen",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "请你发表你对自己的看法?"
},
],
stream=True,
temperature=0,
)
for chunk in response:
content = chunk.choices[0].delta.content
if content:
print(content, end='', flush=True)
print('\n')
前后端结合版本:使用Python和Web框架进行流式调用
在前后端结合的场景下,我们需要在前端显示实时生成的文本,并在后端使用Python处理流式调用。这里以Flask作为Web框架,展示如何构建一个简单的流式文本生成服务。
前端实现
前端可以使用JavaScript的Fetch API来消费这个流式服务。下面是一个简单的HTML页面,展示了如何动态显示生成的文本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Stream Example</title>
</head>
<body>
<pre id="output"></pre>
<script>
const output = document.getElementById('output');
fetch('http://127.0.0.1:5000/stream', { method: 'GET' })
.then(response => response.body)
.then(stream => {
const reader = stream.getReader();
const decoder = new TextDecoder();
async function readAndLog() {
const { value, done } = await reader.read();
if (done) {
console.log('Stream ended');
return;
}
const chunk = decoder.decode(value, { stream: true });
output.textContent += chunk;
await readAndLog();
}
readAndLog().catch(err => console.error('Failed to read stream: ', err));
})
.catch(error => console.error('Failed to fetch stream: ', error));
</script>
</body>
</html>
后端实现
from flask import Flask, Response
from openai import OpenAI
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
client = OpenAI(
api_key="YOUR_OPENAI_API_KEY",
base_url="http://XX.XX.XX.XX:8889/v1",
)
@app.route('/stream', methods=['GET'])
def chat():
response = client.chat.completions.create(
model="QWen",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "请你自我介绍下?"},
],
stream=True,
temperature=0,
)
def generate():
for chunk in response:
content = chunk.choices[0].delta.content
if content:
yield content
return Response(generate(), mimetype='text/plain')
if __name__ == '__main__':
app.run(debug=True)
结论
流式调用是处理大模型实时任务的有效方式,无论是纯后端还是前后端结合的场景,都可以通过适当的技术实现。上述示例展示了如何使用Python和Flask构建一个基本的流式文本生成服务,并在前端动态显示生成的文本。这种方法可以应用于各种需要实时反馈的NLP任务,如聊天机器人、自动写作等。