blog.coinsect.io
🇰🇷
원문
마크다운
2024-07-08
359
공유

구글 Gemini 1.5 flash를 이용해 스트리머 선물 포지션 입력 자동화하기

운영중인 사이트 [코인충](https://coinsect.io/)에는 박호두, 사또, 짭구 등 유명 스트리머들의 포지션을 거의 실시간에 가깝게 계속 추적해서 보여주는 기능이 있다. ![실시간 포지션](https://d1085v6s0hknp1.cloudfront.net/boards/coinsect_blog/321667ca-4e6a-45eb-85d1-b172718f2b2a_image.png) 코인충 관리자 페이지의 '실시간 포지션' 메뉴 ![재래식 모니터링]( https://d1085v6s0hknp1.cloudfront.net/boards/free_board/d28bd415-b424-4180-baf2-06e05557c7a6_image.png) 모니터링은 재래식으로 이루어진다 영양가도 없는 이들의 포지션을 입력하려면 일일히 그들의 방송을 보면서 직접 입력하는 수 밖에 없는데, 내 사이트를 찾는 사람들이 피크 시간대(밤 10:00~)에는 무려 4~500명에도 달하기 때문에 그들을 위해서 이 수고를 감수하고 있다. 그렇다. 정말 위처럼 여러 스트리머들의 방송을 동시에 띄워놓고 실제 보면서 포지션을 업데이트하는 것이다 [...] 사실 이 수고를 덜기 위해 자동화를 하려는 생각은 오래전부터 하고 있었다. 처음 시도했던 방법은 이미지 인식 API를 이용해 화면에서 특정 위치의 숫자들을 추출해서 거래소별로 어떤 값이 entryPrice인지, liqPrice인지 등을 다 분석해 시행착오를 거치며 파싱하는 구현을 했었으나, 스트리머들이 화면을 매번 완전히 똑같이 띄우지도 않을 뿐더러 거래소들도 한 번씩 업데이트를 하며 UI가 달라지는 것을 내가 따라가기도 귀찮아 결국 때려쳤었다. 그런데 LLM이라는게 등장했고, chatgpt나 gemini를 통해 멀티모달로 테스트해보면 어떤 거래소이든 상관없이 상당히 높은 정확도로 원하는 형태의 JSON을 응답받을 수 있었다. ```javascript { entryPrice: number, liqPrice: number, size: number, contract: string, } ``` 그러나 역시 API 비용이 공짜가 아니었기 때문에, 굳이 여기에다가 돈을 쓰고 싶지는 않았다. 그런데 얼마 전 구글이 [gemini-1.5-flash](https://ai.google.dev/gemini-api/docs/vision?hl=ko&lang=node#prompt-multiple) API를 무료로 풀었다. 적용해보니 상당히 잘 되어서 바로 사용하게 되었다. responseMimeType을 json으로 고정할 수 있는 점도 장점인데, 이게 되지 않는다면 이론상 꼭 JSON으로 응답받을 수 있다는 보장이 없기 때문이다. 프롬프트를 포함한 코드는 아래와 같다. ```javascript autoParse: async (url: string) => { const genAI = new GoogleGenerativeAI(process.env.GOOGLE_AI_STUDIO) const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash', generationConfig: { responseMimeType: 'application/json', }, }) const result = await model.generateContent([{ text: ` Fill this JSON using given image. Useful numbers are located at the bottom of the image. You can guess what is 'entry' and what is 'liq' by looking at the numbers, with a given position size (could be positive or negative). { "entryPrice": number, // some platforms say it as 'open' price. "liqPrice": number, "size": number, // Negative if it looks like a short position, positive if it looks like a long position. "contract": string // e.g. 'BTCUSDT' | 'ETHUSDT' ... ends with 'USDT'. If you're not sure, just put 'BTCUSDT'. } `, }, { inlineData: { mimeType: 'image/png', data: await helpers.imageUrlToBase64String(url), }, }]) return result.response.text() }, ``` 사람이 이미지를 보고 정보를 인식할 수 있으면 LLM도 나 못지 않게 잘 할 수 있다는 것이 느껴질 정도로 상당히 정확도가 높다. 비용이 무료이기 때문에, 실시간 스트리밍 중인 라이브 URL만 입력해두면 주기적으로 알아서 그 방송의 현재 화면을 스냅샷으로 떠와서 위 API까지 요청하는 크론잡을 구현해두면 내가 아예 여기서 손을 떼도 되지 않을까 싶다.~~어떻게 AI가 인건비를 줄이고 일자리를 없애버리는지 피부로 느껴진다~~
1