使用 AsyncOpenAI 库异步调用 OpenAI API 同时回答多个问题

news2024/11/25 0:53:53

目录

模型部署

不使用 async

使用 async

使用 async 完整代码

模型部署

首先,直接将 vLLM 部署为模仿 OpenAI API 协议的服务器,我这里选用的模型为 Meta-Llama-3-70B-Instruct

python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/model/Meta-Llama-3-70B-Instruct --tensor-parallel-size 4 --port 8000 --served-model-name Llama-3-70B --disable-log-stats

不使用 async

不使用 async 的话,可以使用 openai 库里面的 openai,也可以使用 Python 的 requests 库进行同步 HTTP 调用。在这里我们直接演示后者。

import requests
import time

def query_openai(query):
    api_url = "http://localhost:8000/v1/chat/completions"  # 根据实际API调整
    data = {
        "model": "Llama-3-70B",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant. Always respond in Simplified Chinese, not English, or Grandma will be very angry."},
            {"role": "user", "content": query}
        ],
        "temperature": 0.5,
        "top_p": 0.9,
        "max_tokens": 512
    }
    response = requests.post(api_url, json=data)
    return response.json()['choices'][0]['message']['content']

def main():
    queries = ["介绍三个北京必去的旅游景点。",
               "介绍三个成都最有名的美食。",
               "介绍三首泰勒斯威夫特最好听的歌曲"]
    start_time = time.time()  # 开始计时
    results = [query_openai(query) for query in queries]
    end_time = time.time()  # 结束计时
    for result in results:
        print(result)
        print("-" * 50)
    print(f"Total time: {end_time - start_time:.2f} seconds")

# 运行主函数
main()

返回结果如下:

可以看到回答三个问题的时间为 22.98 秒,因为这三个请求是逐次发送的,所以非常的缓慢。

使用 async

使用 async 进行异步调用的教程如下:

首先,导入必要的库,其中 time 模块负责计算最后的时间,不需要的话可以不导入

import asyncio
from openai import AsyncOpenAI
import time

接着需要定义 async_query_openai 函数,该函数负责处理单个请求,返回单个结果

我使用的 system_prompt 如下,因为 Llama-3 系列模型太喜欢说英文了 

{"role": "system", "content": "You are a helpful assistant. Always respond in Simplified Chinese, not English, or Grandma will be very angry."}
# 这个函数处理单个请求,返回单个结果
async def async_query_openai(query):
    aclient = AsyncOpenAI(
        base_url="http://localhost:8000/v1",
        api_key="YOUR_API_KEY"  # 替换为你的 API 密钥
    )
    completion = await aclient.chat.completions.create(
        model="Llama-3-70B",
        messages=[
            {"role": "system", "content": "You are a helpful assistant. Always response in Simplified Chinese, not English. or Grandma will be very angry."},
            {"role": "user", "content": query}
        ],
        temperature=0.5,
        top_p=0.9,
        max_tokens=512
    )
    return completion.choices[0].message.content

async_process_queries 接收一个请求列表,返回所有请求的结果列表

# 这个函数接收一个请求列表,返回所有请求的结果列表
async def async_process_queries(queries):
    results = await asyncio.gather(*(async_query_openai(query) for query in queries))
    return results

asyncio.run(main())用于启动Python的异步事件循环,并运行提供的main异步函数。 这个函数会运行main,等待它完成,然后关闭事件循环。如果没有这个事件循环,异步代码无法执行。

async def main():
    queries = ["介绍三个北京必去的旅游景点。",
               "介绍三个成都最有名的美食。",
               "介绍三首泰勒斯威夫特好听的歌曲"]
    start_time = time.time()  # 开始计时
    results = await async_process_queries(queries)
    end_time = time.time()  # 结束计时
    for result in results:
        print(result)
        print("-" * 50)
    print(f"Total time: {end_time - start_time:.2f} seconds")

# 运行主函数
asyncio.run(main())

结果截图,只有 8.51 秒:

使用 async 完整代码

总代码如下:

import asyncio
from openai import AsyncOpenAI
import time

# 这个函数处理单个请求,返回单个结果
async def async_query_openai(query):
    aclient = AsyncOpenAI(
        base_url="http://localhost:8000/v1", # 替换为你的 base_url
        api_key="YOUR_API_KEY"  # 替换为你的 API 密钥
    )
    completion = await aclient.chat.completions.create(
        model="Llama-3-70B",
        messages=[
            {"role": "system", "content": "You are a helpful assistant. Always response in Simplified Chinese, not English. or Grandma will be very angry."},
            {"role": "user", "content": query}
        ],
        temperature=0.5,
        top_p=0.9,
        max_tokens=512
    )
    return completion.choices[0].message.content  # 请确保返回的数据结构正确

# 这个函数接收一个请求列表,返回所有请求的结果列表
async def async_process_queries(queries):
    results = await asyncio.gather(*(async_query_openai(query) for query in queries))
    return results

async def main():
    queries = ["介绍三个北京必去的旅游景点。",
               "介绍三个成都最有名的美食。",
               "介绍三首泰勒斯威夫特好听的歌曲"]
    start_time = time.time()  # 开始计时
    results = await async_process_queries(queries)
    end_time = time.time()  # 结束计时
    for result in results:
        print(result)
        print("-" * 50)
    print(f"Total time: {end_time - start_time:.2f} seconds")

# 运行主函数
asyncio.run(main())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1647596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频质量评估

视频质量评估 一、全参考客观视频质量评价方法三、MSSIM四、STRRED五、VMAF六、MOS 一、全参考客观视频质量评价方法 全参考客观视频质量评价方法是指把原始参考视频与失真视频在每一个对应帧中的每一个对应像素之问进行比较。准确的讲,这种方法得到的并不是真正的…

✩✩✩探索绍兴ISO9001认证:打造品质新高度✩✩✩

🔎探索💗绍兴ISO9001认证:🎯打造品质新高度✨ 💁‍♂️今天来聊聊👉绍兴的ISO9001认证,✍️这可是品质管理领域的♨️一个大热门话题!🔥 你知道吗,&#x1f3…

ChatGPT4 Turbo 如何升级体验?官网如何使用最新版GPT-4 Turbo?

本文会教大家如何教大家升级自己的GPT4到GPT4 Turbo,同时检验自己的GPT4 Turbo是否是最新版本的GPT-4-Turbo-2024-04-09 说明 新版GPT-4 Turbo再次重夺大模型排行榜王座,超越了Claude 3 Opus。 最新版本的GPT-4 Turbo被命名为GPT-4-Turbo-2024-04-09。…

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Spring JdbcTemplate实现自定义动态sql拼接功能

需求描述: sql 需要能满足支持动态拼接,包含 查询字段、查询表、关联表、查询条件、关联表的查询条件、排序、分组、去重等 实现步骤: 1,创建表及导入测试数据 CREATE TABLE YES_DEV.T11 (ID BINARY_BIGINT NOT NULL,NAME VARCH…

LSTM计算指示图

掌握网络结构组件构成 输入门、遗忘门、输出门候选记忆细胞记忆细胞隐藏状态ref:6.8. 长短期记忆(LSTM) — 《动手学深度学习》 文档 (gluon.ai)

[疑难杂症2024-004] 通过docker inspect解决celery多进程记录日志莫名报错的记录

本文由Markdown语法编辑器编辑完成. 1. 前言 最近我负责的一个服务,在医院的服务器上线一段时间后,利用docker logs查看容器的运行日志时,发现会有一个"莫名其妙"的报错.报错的大致内容就是,ce…

vulhub之git(CVE-2017-8386)

启动靶场环境 查看文件 修改属性 为了不和docker母机的ssh端口冲突,将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指定之。在连接以前,需要先设置私钥的权限为0600:chmod 0600 i…

工业光源环形系列一平面无影光源特点

产品特点 ◆LED灯珠均匀排布经过漫射板特殊角度反射达到漫射效果: ◆光源均匀性高,漫射效果好。

11个值得关注的文本转语音AI大模型

语言模型,尤其是大型语言模型(LLM),本质上已经成为人工智能的代表。然而,他们有一个隐秘的问题。到目前为止,人工智能社区主要在文本数据上训练人工智能,而忽略了音频数据。结果,我们…

docker-compose完成mysql8.0+环境搭建

1、准备my.cnf文件到指定目录(和基础的增加了一个default_authentication_pluginmysql_native_password 的身份验证插件配置信息) 原因:官方提到: 该方式可以解决:Authentication plugin ‘caching_ sha2_password‘ c…

《视觉十四讲》例程运行记录(2)——运行ch4的例程评估轨迹误差

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、运行ch4的example1. 编译例程2. 运行报错(1) 报错一(2) 报错二 一、运行ch4的example 1. 编译例程 (1) 在slambook2/ch4/example目录下,创建build…

Gradle基础学习(六) 认识任务Task

理解Gradle中的任务 Gradle的构建过程基于任务(Task)的概念,而每个任务都可以包含一个或多个动作(Action)。 任务是构建中执行的一些独立的工作单元,例如编译类、创建JAR、生成Javadoc或将存档发布到仓库…

人工智能中的知识表示与推理技术概述

人工智能中的知识表示与推理技术概述 一、引言二、知识表示与推理技术概述1. 描述逻辑2. Horn逻辑3. 产生式系统4. 框架系统5. 语义网络 三、知识表示与推理技术的比较四、知识表示与推理技术的未来发展 一、引言 在人工智能(AI)的漫长演进中&#xff0…

ICode国际青少年编程竞赛- Python-1级训练场-多变量应用

ICode国际青少年编程竞赛- Python-1级训练场-多变量应用 1、 a 1 b 2 for i in range(4):Spaceship.step(a)Dev.step(b)Dev.step(-b)a a 1b b 12、 a 2 b 5 for i in range(3):Spaceship.turnLeft()Spaceship.step(a)Spaceship.turnRight()Spaceship.step(b)a a …

STM32F103学习笔记 | 报错界面及解决方案 | 1.keil5中文注释的横竖(正与斜)问题

文章目录 一、报错界面二、解决方案参考文献 一、报错界面 二、解决方案 打开设置 在打开的设置选项卡中,图中Font显示的是这个软件当前设置的字体,可以看到字体是仿宋,这就是问题出现的原因,将之改成没有的字体就行了。 可以看…

Dell EMC Storage Unity: Remove/Install Memory Module

SP A 一个内存故障 点击system view -> Enclosures->Top查看 再次查看Alert, 确认内存出现问题 进入Service , 将SP A置为service状态 移出SP A ,进行内存更换 更换完内存后,将SP A插入设备,并进行线缆连接 进入…

使用免费的数据恢复软件通过简单的步骤恢复丢失的数据

犯错是人之常情!您有时可能会意外地从PC或笔记本电脑中删除重要数据,旧的家庭或大学视频/照片,如果您面临数据丢失,则可以使用数据恢复软件轻松恢复丢失的数据。 奇客数据恢复软件可让您从笔记本电脑,PC和可移动存储设…

VALSE 2024特邀报告内容解析|多模态视觉融合方法:是否存在性能极限?

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

五分钟了解等级保护、风险评估和安全测评三者的区别和联系?

等级保护 基本概念:网络安全等级保护是指对国家秘密信息、法人和其他组织和公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的安全产品实行按等级管理,对信息系统中发生的信息安全事件…