๐ŸŒ Nano banana pro

๋ฌธ์ œ

  • Nano banana pro ๋ชจ๋ธ์„ ์ด์šฉํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋˜ ์ค‘ retry ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ์Œ์—๋„ api ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋กœ None์ด ๋ฐ˜ํ™˜๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ๋‹ค.
  • ๊ตฌํ˜„ํ•ด๋‘” retry ๋กœ์ง์ƒ None์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋ชจ๋ธ ํ˜ธ์ถœ ๋ฐ ์ƒ์„ฑ ๊ณผ์ •์ด ๋‹ค์‹œ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ…Œ์ด์ง• ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ ์‹œ ์ข…์ข… timeout error๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด ์ƒํƒœ๋กœ ์šด์˜ ์„œ๋ฒ„์— ๋ฐฐํฌ๋œ๋‹ค๋ฉด ์ƒ์„ฑ ๊ฒฐ๊ณผ์— ์ผ๊ด€์„ฑ์ด ์—†์–ด์„œ ๊ณ ๊ฐ๋“ค์—๊ฒŒ ์‹ ๋ขฐ๋ฅผ ์ค„ ์ˆ˜ ์—†๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

None์— ๋Œ€ํ•œ ๊ณ ์ฐฐ

  • '์™œ ์ด๋ ‡๊ฒŒ None์ด ์ž์ฃผ ๋œจ์ง€?' ์‹ถ์–ด์„œ ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๋ฉด์„œ ๋‚ด๊ฐ€ ์ถ”์ธกํ•œ ๋‚ด์šฉ๊ณผ ๊ฐ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ๋ฐ˜๋ฌธํ•ด๋ณธ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    • ๐Ÿ’ฃ ์œ ํ•ดํ•œ ํ”„๋กฌํ”„ํŠธ?

      • ํ•œ์ฐฝ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ Gemini api๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์ด์œ ๋Š” ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ๊ฐ„ํ˜น '์ด ํ”„๋กฌํ”„ํŠธ๋Š” safety ์ธก๋ฉด์—์„œ ํ•„ํ„ฐ๋ง๋˜์—ˆ๋‹ค'๋Š” ๋‰˜์•™์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‹ค.

      • ๋‚ด๊ฐ€ ์ •๋ง toxicํ•œ(๋˜๋Š” toxicํ•˜๋‹ค๊ณ  ์˜์‹ฌ๋ฐ›์„๋งŒํ•œ) ๋‚ด์šฉ์€ ๋„ฃ์€ ๊ฒƒ๋„ ์•„๋‹ˆ์—ˆ๊ณ  ํ•ด๋‹น ๊ฒฐ๊ณผ๋Š” ์ •๋ง ๊ฐ„ํ˜น ๊ฐ€๋‹ค 1~2๋ฒˆ ๋œฐ๊นŒ ๋ง๊นŒ ํ•œ ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กฌํ”„ํŠธ์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

    • ๐Ÿ’ฐ ํ† ํฐ์ˆ˜ ์ดˆ๊ณผ?

      • ์ด๊ฒƒ ๋˜ํ•œ Gemini๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๋Š” ์–‘์˜ ํ† ํฐ์„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์—ˆ๊ฑฐ๋‚˜ ๋‚˜์˜ฌ ๋ฆฌ๊ฐ€ ์—†์–ด์„œ ์›์ธ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋ฌธ์ œ ์›์ธ ํŒŒ์•… ๋ฐ ํ•ด๊ฒฐ

  • ๊ทธ๋ ‡๋‹ค๋ฉด ๋Œ€์ฒด ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ผ๊นŒ ์‹ถ์–ด์„œ ๋‹ค์†Œ ๋‹จ์ˆœ๋ฌด์‹ํ•œ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๊ทธ๋งŒํผ ๊ฐ€์žฅ ํ™•์‹คํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” 'print๋ฌธ ์ฐ์–ด๋ณด๊ธฐ' ๋ฐฉ๋ฒ•์œผ๋กœ response.candidates ๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

  • ๋†€๋ž๊ฒŒ๋„! ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ Gemini์˜ thinking ๊ณผ์ •๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.

  • ๋‚˜๋Š” ๋‹ต๋ณ€ ๊ฒฐ๊ณผ์— ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•ด๋‘” ์ƒํƒœ์—ฌ์„œ ํ…์ŠคํŠธ๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ์— None์ด ๋œจ๋Š” ๊ฑฐ์˜€๋‹ค.

    • ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด types.GenerateContentConfig์— response_modalities ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ๋‹ต๋ณ€ ํ˜•์‹์„ IMAGE๋กœ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ๋‹ค.

      config = types.GenerateContentConfig( temperature=temperature, response_modalities=["Image"], # ์ถ”๊ฐ€ํ•œ ์˜ต์…˜ )
    • ์ฐธ๊ณ (Gemini API official documentation)

      response = client.models.generate_content( model="gemini-3-pro-image-preview", contents=[ prompt, Image.open('person1.png'), Image.open('person2.png'), Image.open('person3.png'), Image.open('person4.png'), Image.open('person5.png'), ], config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'], image_config=types.ImageConfig( aspect_ratio=aspect_ratio, image_size=resolution ), ) )

๋А๋‚€ ์ 

  • ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์„ ์ž˜ ์“ธ ์ค„ ์•„๋Š” ๊ฒƒ๋„ ๋Œ€ LLM ์‹œ๋Œ€์˜ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ’ป Python asyncio

asyncio.gather

  • ๋™์‹œ ์š”์ฒญ ์ค‘ ๊ฐ€์žฅ ๋А๋ฆฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ „์ฒด ์‹œ๊ฐ„์ด ๊ฒฐ์ •๋œ๋‹ค.