带有 OpenAI API 调用的“asyncio”在延长运行时间后挂起

'asyncio' with OpenAI API Call Hangs After Extended Run Time

提问人:martin li 提问时间:10/27/2023 更新时间:11/8/2023 访问量:101

问:

我正在使用 asyncio 和 OpenAI API 来同时翻译一组文本。最初,一切按预期进行,我看到控制台中打印了来自 OpenAI 的答案。但是,运行一段时间后,代码似乎挂起。来自 OpenAI 的后续答案不会打印在控制台中,我也没有看到任何“重试”消息。这是我的代码:

import asyncio
from aiohttp import ClientSession
import openai
import os
openai.api_key = os.getenv("OPENAI_API_KEY")

async def _atranslate(sem, messages, **model_kwargs):
    max_retry = 2
    async with sem:
        while max_retry > 0:
            try:
                response = await openai.ChatCompletion.acreate(
                    messages=messages,
                    **model_kwargs
                )
                answer = response.choices[0]['message']['content']
                print(answer)
                return answer
            except Exception as e:
                print(e)
                await asyncio.sleep(5)
                max_retry -= 1
                print('retrying...')
        raise ConnectionError('cannot reach openai!')

async def atranslate(text_list: list, source=None, target='English', max_workers=3, **model_kwargs):
    aio_session = ClientSession()
    openai.aiosession.set(aio_session)
    model_kwargs.setdefault('model', 'gpt-3.5-turbo')
    model_kwargs.setdefault('temperature', 1)
    model_kwargs.setdefault('timeout', 10)
    template = 'Translate the following {source} text into {target}:{text}'
    semaphore = asyncio.Semaphore(max_workers)
    tasks = []
    for text in text_list:
        messages = [{
            'role': 'user',
            'content': template.format(
                source=source,
                target=target,
                text=text
            )}
        ]
        tasks.append(asyncio.create_task(_atranslate(semaphore, messages, **model_kwargs)))
    results = await asyncio.gather(*tasks)
    await aio_session.close()
    return results

if __name__ == '__main__':
    textList = '... (some texts are omitted for brevity)'
    translations = asyncio.run(atranslate(textList*20, 'Korean', 'English',30))

当我运行上面的代码时,它开始很好,但一段时间后,它只是挂起。是什么原因导致的?是否有任何解决方案或建议可以解决这个问题?

我试图更改超时参数或根本不引发 ConnectionError,但它不起作用。我认为这可能是 api 使用限制的问题,但我不知道为什么它不会抛出任何错误。

python-asyncio openai-api aiohttp chatgpt-api

评论

0赞 Nathan Chappell 11/8/2023
您是否正在使用新的 v1.1.1 python 库?没关系,看来你不是。我遇到了类似的问题,这可能与一些技术问题有关。asyncio

答:

2赞 Nathan Chappell 11/8/2023 #1

有两件事,首先我会将 的用法包装在 中,或者将其用作 a,如图所示ClientSessiontry...finallycontextmanager

此外,如果您非常确定在某处吞下了一些例外情况,请尝试捕捉而不是 .是的,有一个类不会捕获,并且库有时会抛出派生的异常。BaseExceptionExceptionBaseExceptionexcept Exception:asyncioBaseException

评论

2赞 martin li 11/16/2023
我想这是我第一次听说 BaseException。我已经尝试了你的方法,效果很好!真的谢谢!