-
[Google Bard] 구글 바드 Spring Boot 연동하기! (feat. 제미나이 AI가 똑똑해졌다며?)스터디 노트 2023. 12. 28. 14:35
안녕하세요 오랜만에 스터디 노트로 인사드립니다.
최근에 혼자서 사부작사부작 Spring Boot에 Bard AI를 연동하는 작업을 하고 있었습니다.
일전에 올렸던 뉴스 파이프라인에 자동으로 붙이는 로직으로 개발을 하고 있었지요.
최근 제미나이의 버전이 업그레이드 되면서 성능이 대폭 향상되었다고 합니다.
과연 얼마나 향상되었을까요?
예전에 뉴스 본문을 던져주고 요약해달라고 하면 헛소리 삑삑 했었는데, 이제는 제대로 요약을 해줄까요?
한 번 해보도록 하겠습니다.
📌 들어가며
이번 연동은 Bard AI에서 제공해주는 google-bard 라이브러리를 통해 Spring Boot로 가벼운 웹 프로젝트를 구현했습니다.
그 전에 먼저 바드에게 '하루 최대 질문 한도가있니?'라고 물어보니 그런거 없다고 많이 질문해달라고 하더군요.
좋았어, 대가리 깨질 준비 해라 바드여!!!
📌 준비하기
Java 17, Spring Boot 3.2.1로 프로젝트를 만들어 주었습니다.
의존성은 아래와 같이 추가해놓았습니다.
// build.gradle ...(생략)... dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.pkslow:google-bard:0.3.6' implementation 'org.jsoup:jsoup:1.17.1' implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } ...(생략)...
여기서 중요한 것은 pkslow의 google-bard 종속성을 추가한 것입니다.
이 라이브러리를 통하여 Google Bard AI에게 질의를 할 것입니다.
그 외에는 프로젝트 내부 필요한 라이브러리를 추가한 것입니다.
📌 구현해 봅시다.
우선 Bard AI에 직접적으로 질의를 하기 위해선 Bard AI에 생성된 토큰 정보를 이용해야 합니다.
이걸 자동으로 갱신하는 기능을 만들어야 하는데, 아직 거기까지는 하지 못했습니다.
일단 토큰은 Bard AI에 접속하신 후 디버깅 툴(F12)을 열어줍니다.
그리고 Application 탭에서 1PSID를 조회해주시면 위와 같이 토큰 정보를 확인할 수 있습니다.
여기서 1PSID와 1PSIDTS를 사용할 것입니다.
이 두가지 token을 ; 를 이용해 서로 연결해줍니다.
즉, 1PSID;1PSIDTS 이런식으로 사용하시면 됩니다.
준비는 끝났습니다.
application.yml에 해당 토큰 정보를 입력해줍니다.
ai: google-bard: token: TOKEN_VALUES
token 값을 입력했다면 이제는 Configuration을 만들어 보겠습니다.
@Configuration public class GoogleBardConfig { @Bean public GoogleBardClient googleBardClient(@Value("${ai.google-bard.token}") String token) { return new GoogleBardClient(token); } }
GoogleBardClient를 생성해줄 때 해당 token을 파라미터로 전달해주면 손쉽게 Client 생성이 가능합니다.
매우 간편하죠? 추가적인 작업은 필요치 않습니다!
원래는 이렇게 하고 가볍게 Controller를 만들어서 Bard AI에 질의하면 끝납니다.
해당 예제는 아래 사이트를 보시면 됩니다.
다만 저는 뉴스에서 긁어와서 본문을 전달하고 해당 내용을 '다섯 줄로 요약' 해주는 것을 자동화하기 위해 구현을 하였기 때문에 구조가 조금 다르게 되었습니다.
우선 Bard에 질의를 하기 위한 Question 클래스를 만들어 주겠습니다.
@Data public class BardQuestion { private String newsId; private String question; private String token; }
newsId는 뉴스의 ID를 지정하기 위함이고, question은 질의 컨텐츠, token은 client의 token갱신을 위해 만들어주었습니다.
여기서 문제가 되는 것은 token이 지속적으로 갱신이 된다는 점인데, 불편하지만 앞서 설명드렸던 token만드는 작업을 지속적으로 해주셔야만 합니다.
손쉽게 하는 방법은 좀 더 찾아보겠습니다..😫
과거 제가 만들었던 뉴스 파이프라인 프로젝트의 아키텍처는 다음과 같았습니다.
여기서 주요 DB를 MongoDB로 사용했고, 이전에 사용했던 LandNews를 그대로 사용해줄 것입니다.
다만 이번에는 MongoDB에 summary 컬럼을 추가하였고, Bard AI에서 요약해준 내용을 그대로 MongoDB에 입력해넣을 예정입니다.
@Getter @Document(collection = "land") @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class LandNews { @Id private Long newsId; private String url; private String title; private Long newsDate; private String summary; public static LandNews of(LandNews landNews, String summary) { return new LandNews(landNews.getNewsId(), landNews.getUrl(), landNews.getTitle(), landNews.newsDate, summary); } }
이를 위해 land Collection과 매칭된 LandNews 클래스를 만들어주고, newsDate와 summary를 추가합니다.
newsDate는 아직 사용하진 않는데, 추후에 사용할 예정입니다.
summary 컬럼이 생기면 다음과 같이 MongoDB에서 조회가 가능해집니다.
summary라는 컬럼이 생겼네요. 이제 여기에 Bard의 답변을 기입할 것입니다.
@Getter @AllArgsConstructor public class BardAnswer { private String chosenAnswer; }
바드가 답변해주는 내용을 담기위한 Answer 클래스입니다.
컨트롤러를 의미에 맞게 구현해준 후 핵심인 Service를 구현합니다.
@Service public class BardService { // Initial Bard API Client private GoogleBardClient client; // Initial MongoDB Template private MongoTemplate mongoTemplate; public BardService(GoogleBardClient client, MongoTemplate mongoTemplate) { this.client = client; this.mongoTemplate = mongoTemplate; } public BardAnswer askBard(BardQuestion question) { return ask(question.getQuestion(), question.getToken()); } ...(생략)... private BardAnswer ask(String question, String token) { Answer answer = client.ask(question); if (!answer.getStatus().equals(AnswerStatus.OK)) { client = new GoogleBardClient(token); answer = client.ask(question); } if (answer.getStatus() == AnswerStatus.OK) { return new BardAnswer(answer.getChosenAnswer()); } throw new RuntimeException("Can't access to Google Bard"); } }
PostMan을 통하여 가벼운 질의는 전달할 수 있습니다.
하지만 제가 전달해야 하는 question의 내용은 신문 본문에 해당하는 긴 문자열이기 때문에 Get으로 전달하기엔 한계가 있습니다.
그래서 Post 메소드를 통해 RequestBody에 담아서 전달해줍니다.
그러기 위해 BardQuestion 객체를 만들어주었지요.
핵심 로직은 가장 아래 Private으로 구현된 ask메소드입니다.
GoogleBard Client에 직접적으로 ask메소드를 호출하며 question을 전달해줍니다.
그럼 Google-Bard 라이브러리 내 Answer 객체의 ChosenAnswer로 답변을 전달해줍니다.
저희는 그걸 꺼내서 사용하면 되지요.
중간에 Status가 OK가 아닐 경우에는 대부분 Bard Token의 유효기간이 지났기 때문일겁니다.
그래서 token을 외부에서 직접 입력받아 Client를 재생성하여 질의하도록 구현을 해놓았습니다.
📌결과물
가볍게 만들어본 녀석의 구현 화면은 아래와 같습니다. 디자인적인 고려는 전혀 되어있지 않아요 ㅎ
Google Bard AI가 뉴스 본문을 읽고 요약한 내용입니다.
과거에는 헛소리 삑삑하며 본문의 내용과는 완전 다른 내용으로 요약을 해주곤 했었는데, 성능이 정말 많이 좋아졌네요.
생각보다 더 핵심을 쏙쏙 뽑아서 잘 요약을 해주는지라 매우 편리하게 애용하고 있습니다 ㅎ
Bard AI 연동은 정말 간단하니 필요하신 분들께선 직접 해보시는 것도 서비스 개선에 큰 도움이 될 것 같습니다 ㅎ
'스터디 노트' 카테고리의 다른 글
[SPRING BOOT] jar가 아닌 war로 배포 및 구동을 원할 경우 (0) 2024.02.23 Redis로 초간단 Pub / Sub 구축하기! Redis + Spring Boot (1) 2023.12.29 레디스(Redis)? 함 써봅시다. Spring Boot + Redis 연동하기! (1) 2023.12.21 레디스란? 레디스의 백업 프로세스에 대하여 (0) 2023.12.20 Ubuntu(우분투) 환경에서 Java 초간편 설치하기 (0) 2023.12.13