오류창이 떴을 때 한 줄 한 줄 다 읽어보는데 처음보는 Exception Value였어요.

"'coroutine' object has no attribute 'choices'"
이게 대체 뭐죠? 🧐

 

해결 과정

generate_3d_prompt 함수 비동기 함수인데 async_to_sync로 동기적으로 호출하려고 할 때 문제가 발생했습니다.

aclient.chat.completions.create는 코루틴 객체를 반환하는데, 이 코루틴 객체는 await를 사용해서 실행해야 실제 결과를 얻을 수 있습니다.
하지만 async_to_sync는 코루틴을 실행해주지만, generate_3d_prompt 함수 자체가 await를 사용하지 않고 코루틴 객체(response)의 속성(choices)에 바로 접근하려 해서 에러가 발생한 것입니다.
* 코루틴(coroutine) 객체?
쉽게 말해, 나중에 실행될 일을 담고 있는 상자 같은 것
코루틴 함수(약속된 일)를 실행하면 바로 일이 시작되지 않고, 언제든 실행할 수 있는 코루틴 객체가 만들어집니다.
async def boil_water():  # 물을 끓이는 코루틴 함수
    print("물이 끓는 중...🔥")
    await asyncio.sleep(3)  # 3초 동안 기다림 (하지만 다른 작업도 가능!)
    print("물이 끓었어요! 🍜")

# boil_water()를 실행해도 물이 바로 끓지 않고, "코루틴 객체"가 반환됨
coro = boil_water()
print(coro)​

출력
# bash
<coroutine object boil_water at 0x...>​


"물이 끓는 중..."이라는 말이 출력되지 않고, 코루틴 객체가 생긴 것뿐이에요.


코루틴 객체를 실행하려면?

await 또는 asyncio.run()을 써야 해요.
import asyncio

async def main():
    await boil_water()  # 이제야 물이 끓기 시작!

asyncio.run(main())​


출력

물이 끓는 중...🔥
(3초 후)
물이 끓었어요! 🍜

 


이제서야 물이 끓었네요. 언제 실행할지 직접 정할 수 있는 것코루틴 객체예요.

저 함수(def generate_3d_prompt)가 코루틴 함수인데 await 없이 호출하려고 해서 일어난 오류였군요.

 

이렇게 async와 await로 감싸주니까 해결되었어요. 👍🏻

🐾Recent posts