오류창이 떴을 때 한 줄 한 줄 다 읽어보는데 처음보는 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로 감싸주니까 해결되었어요. 👍🏻
'👥 최종 팀 프로젝트(250227~250331) > 트러블 슈팅 🤯' 카테고리의 다른 글
[🤯Back-end] Django가 실행되면서 .env가 로드되지 않는 오류 (0) | 2025.03.19 |
---|---|
[🤯Back-end] OpenAI 버전에 따라 작동되는 코드가 다르다. (0) | 2025.03.19 |
[🤯Back-end] OPENAI 실행 시, 작성하는 변숫값 입력 실수 (0) | 2025.03.19 |
[🤯User_error] texture prompt 작성도 심혈을 기울이자. (0) | 2025.03.19 |
[🤯Front-end] {% load static %} 사용 미숙으로 인한 오류 (0) | 2025.03.19 |