이전 게시물을 통해서 AWS Bedrock, 특히 KnoeledgeBase를 통해서 생성형 AI Chatbot 구현에 대한 게시물을 작성했다.
하지만, `AI Chatbot 구현하기 use Bedrock KnowledgeBase` 게시물 하단에 적은것과 같이 아직 고도화해야할 점이 많다.
[AWS][AI] AWS Bedrock KnowledgeBase 사용 방법
아래 게시물에서 AI에 대해서 짧게 나마 공부하였고, 그래서 어떻게 구현할 수 있을까? 관심을 가지게되었다. [AI] 요즘은 안하는 사람이 없다는 Gen AI, 나도 해보자.요즘 뉴스, 유튜브를 보면 첫
dobby-isfree.tistory.com
[AWS][AI] AI Chatbot 구현하기 use Bedrock KnowledgeBase
Bedrock KB를 구성했다면, 이제는 KB를 사용해보는 방법에 대해서 알아본다. KB를 만드는것처럼 아주아주 간단하다.일반적으로 LLM, AI 관련된 서비스는 Python으로 많이들 구현하지만 필자는 Go 기반의
dobby-isfree.tistory.com
오늘은 Chatbot 응답 품질 고도화하기 위한 방법에 대해서 설명하고자 한다.
아! 참고로 필자가 작성한 방법 외에 응답 품질을 높이는 방법은 아주 많고, 필자가 작성한 글이 정답은 아니다.
참고는 하되, 각자 상황에 맞춰서 맞춤식으로 최적화하는것을 권장한다.
AWS Bedrock 응답 품질 높이기 프로젝트
시스템 구성도
현재 생성형 AI Chatbot의 구성도는 아래와 같다.
실제 AWS Bedrock을 호출하고, 응답을 만들어서 Slackd으로 보내는 Chatbot Layer가 있고,
AWS Bedrock에서 활용하는 OpenSearch Embedding 데이터를 만들기 위한 데이터 수집 Layer가 존재한다.
Layer 설명
Chatbot Layer
가장 중요한 부분이자, 사용자의 입력을 받고 AWS Bedrock 호출 등을 전체적으로 관리하는 부분이다.
그리고 Prompt와 Bedrock 응답을 DynamoDB에 저장하여 ChatGPT와 유사하게 ChatHistory를 관리하여 대화의 흐름을 이어가고자 했다.
데이터 수집 Layer
말 그대로 데이터를 수집하는 영역이다. AWS Bedrock KnowledgeBase를 활용하는데 현재 콘솔에서 Auto Sync가 없다.
그래서 EventBridge + Lambda를 통해서 일 단위 Sync를 진행한다.
이때 최초 Sync 이후에는 증분데이터만 Sync하기 때문에 시간도 적게 걸리고, 비용도 적게 든다.
프롬프트 엔지니어링
생성형 AI 응답 품질을 높이기 위해서 필자가 추천하는 가장 좋은 방법이라고 생각한다.
물론, 다른 기술적 방법도 많이 있겠지만 프롬프트 엔지니어링은 상대적으로 기술적 요구사항은 적은편이다.
(그렇다고 아예 없는것도 아니다.)
구글링을 해보면 다양한 프롬프트 엔지니어링 기법이 나온다.
이중에서 필자가 선택한 방법은 `XML 태그 활용`, `One-Shot Prompt` 기법을 적용했다.
각각 간략하게 설명을 하면 다음과 같다.
1. XML 태그 활용
- 필자는 Claude Sonnet 3.5 모델을 사용했는데, 해당 모델은 XML 기반으로 지시어를 명확히 줬을 때 응답품질이 좋다고 알려져있다.
2. One-Shot Prompt
- 예시를 제공하는 것이다. 그럼 모델은 해당 예시를 기본 응답으로 삼아 예시 포맷을 그대로 인용하게 된다.
AWS Bedrock Param 최적화
그리고 두번째가 Parameter를 최적화하는 방법이다.
AWS Bedrock을 사용하면 기본적으로 Temperature, topP, topK 값에 따라서 응답이 달라지는것을 확인할 수 있다.
그리고 각각의 Parameter는 간략하게 아래와 같이 설명할 수 있다.
1. Temperature
- 예측 가능한 결과를 만들 때 사용한다. 0에 가까울수록 다음 답변으로 나올 확률이 높은 단어를 사용한다.
- 값이 낮으면 예측 가능한 응답을 얻을 수 있고, 값이 높으면 창의적으로 무작위한 응답을 얻을 수 있다.
- 그래서 일반적으로 매우 정확한 데이터를 요구하는 경우 값을 낮춰서 상요한다.
2. topP
- 확률 분포의 누적 합계를 뜻한다.
- 값이 낮으면 매우 유의미있는 데이터만 가능하는 반면에, 값이 높으면 더 많은 후보군의 데이터를 사용한다.
- 그래서 일반적으로 매우 정확한 데이터를 요구하는 경우 값을 낮춰서 상요한다.
3. topK
- 가장 확률이 높은 단어를 몇개까지 고려할지에 대한 파라미터이다.
- 값이 높을수록 가장 확률이 높은 단어를 채택할 확률이 높다.
AWS Bedrock Console에 들어가면 아래와 같이 테스트 할 수 있는 플레이그라운드 카테고리가 있다.
플레이그라운드에서 프롬프트 엔지니어링을 테스트할 수 있고, Bedrock Param도 테스트 할 수 있다.
- 만약 Bedrock AI Chatbot을 구현할 예정이라면, 꼭 최적의 값을 찾는걸 권장한다.
ChatHistory 관리
가장 마지막으로 대화의 흐름을 이어갈 수 있도록 ChatHistory를 관리하는 방법이다.
Bedrock을 보면 RetrieveAndGenerate로 이미 제공하고 있는 API가 있다.
하지만 실제로 사용해보면 ChatHistory가 제대로 관리되지 않고, 프롬프트로 제대로 전달되지 않는다.
RetrieveAndGenerate - Amazon Bedrock
Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.
docs.aws.amazon.com
이럴 때 일반적으로 사용하는 방법이 이전 대화 이력을 DB 또는 Redis에 저장해서 사용하는것이다.
- 필자는 AWS DynamoDB를 사용했다.
그래서 아래의 과정을 통해서 ChatHistory를 관리한다. 그리고 아래 1~5의 과정을 반복한다.
- 사용자가 슬랙을 통해서 특정 질문을 한다.
- 동일한 요청으로 대화한 이력이 있는지 DynamoDB에서 조회한다.
- 2.의 데이터가 있을 경우 이를 활용하여 Prompt를 만든다.
- 3.에서 만들어진 Prompt를 통해서 AWS Bedrock을 호출하여 응답을 얻는다.
- 최종적으로 얻어진 응답과 최초의 사용자 요청을 DynamoDB에 저장한다.
Redis는 일반적으로 휘발성 데이터를 위해서 사용되므로 배제하였다. 그리고 고려한것이 RDS, DynamoDB이다.
- RDS는 1개 필드에 들어가는 길이에 제한이 있는 반면에 DynamoDB를 조금 더 큰 사이즈의 데이터를 넣을 수 있다.
- Bedrock이 전달해주는 응답 데이터는 아주 긴 경우가 있기 때문에 이를 RDS에 다 저장할 수 없는 경우가 있었다.
사용 사례
실제 사용 사례를 보면 아래와 같이 Confluence에서 검색하고 요약해야 하는 내용을 Chatbot에 질의를 한다.
또는 단순한 솔루션 사용 방법에 대한 가이드 문서를 추가하여, 솔루션 담당자 대신에 사용 방법을 대신 답변하기도 한다.
이전에는 이런류의 생성형 AI Chatbot을 만들기 위해서 많은 기술과 노력이 필요했던것 같다.
그래서 이전 서비스에서 제공해주는 Chatbot을 보면 대부분 시나리오 기반으로 정해진 요청에 따라 정해진 응답만 할뿐이다.
하지만 2024년부터 AI 서비스가 대중화된 이후, 패러다임이 바뀌었다. 이제는 간단한 API를 통해서 AI 서비스를 이용할 수 있고
AWS를 사용하지 않더라도 공개되어 있는 상용 모델을 Local PC에 띄워서 API 서빙도 할 수 있다.
이제는 얼마나 잘 개발하느냐 보다는, 얼마나 좋은 아이디어가 있는지? 얼마나 좋은 서비스를 기획할 수 있을지?가 중요한 시대이다.
간단한 작업이나 요청은 AI가 대신 처리하고, 사람은 그 시간을 절약해서 고부가가치의 일을 하면 된다.
개인적인 생각으로는 AI가 나를 대체할 것을 걱정하기 보다는, AI를 어떻게 하면 잘 활용할 수 있을까?를 고민해야 한다고 생각한다.
그럼 이제 끝!
위 AI Chatbot에 대한 질문이나 문의사항이 있으시면 댓글 남겨주세요 :) 감사합니다.
'기술 이모저모 > [Ops] Devops' 카테고리의 다른 글
[AWS][AI] AI Chatbot 구현하기 use Bedrock KnowledgeBase (3) | 2024.10.06 |
---|---|
[AWS][AI] AWS Bedrock KnowledgeBase 사용 방법 (1) | 2024.10.05 |
[Finops] AMD vs ARM, AWS Graviton Node (1) | 2024.09.22 |
[AI] 요즘은 안하는 사람이 없다는 Gen AI, 나도 해보자. (0) | 2024.06.30 |
[LGTM] Observability 기술스택 변경 여정 두번째, PLG 스택 배포 (0) | 2024.03.10 |