RAG-based-ai-chatbot
Amazon Bedrock 으로 RAG(retrieval augmented generation) Chatbot을 제작한 프로젝트입니다. 본 프로젝트를 이용해서 사용자는 LLM 모델을 사용해서 질문에 대한 응답을 생성할 수 있습니다. 또한 참고할 문서를 업로드 하고, 응답 생성시 참고하여 문서의 도메인 특화된 응답을 얻을 수 있습니다.
Command
Docker build
docker buildx build --no-cache --platform=linux/amd64 -t qarag .
Docker tag
docker tag qarag:latest [ACCOUNT ID].dkr.ecr.us-west-2.amazonaws.com/qarag:latest
Docker push
docker push [ACCOUNT ID].dkr.ecr.us-west-2.amazonaws.com/qarag:latest
Cloud Architecture
![cloud-architecture-02](https://private-user-images.githubusercontent.com/1788481/263707509-f33fa6c6-48e7-409a-b745-ce6364e33bd6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI2MzcwNzUwOS1mMzNmYTZjNi00OGU3LTQwOWEtYjc0NS1jZTYzNjRlMzNiZDYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmE0ZTI0ZDZiN2E5N2RjYjg3NTQ3ZjU4NWNhMDAwNWQzYTJhMWNlOTRlOGNiMjczMzJiOGExNzYzOTJkNGE5OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.pGMRF-nQPP3A5UAuAME-yrpw1iPTX_5DZN93TzbWlL8)
Amazon Bedrock을 이용해서 응답을 생성하고, Amazon OpenSearch를 이용해서 문서와 임베딩 벡터 값을 저장합니다. Frontend 와 Backend가 포함된 본 애플리케이션은 Amazon ECS에 배포되어 운영됩니다.
Application Architecture
애플리케이션을 구성하고 있는 아키텍처에 대해 살펴보도록 하겠습니다.
UseCase
![usecase-01](https://private-user-images.githubusercontent.com/1788481/259589979-2fc41ea0-c573-497c-a08e-7bf9a65dd79e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTU4OTk3OS0yZmM0MWVhMC1jNTczLTQ5N2MtYTA4ZS03YmY5YTY1ZGQ3OWUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NjJjNGJhNzU3ODU2OGMyNTFhZGUxNDgyNmYyZjNkNTM0YTVlMmFlMzM4ZDJjOWEyZjNjZGVlNzdlNjczYWViOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.QLt8WkLMR9bqgBFSWc8SNC9bEClmg-pIxRbUo384c2c)
- Store Document: 응답 생성시 참고할 문서를 업로드합니다.
- Delete Document: 업로드한 문서를 삭제합니다.
- Get Answer: LLM 과 업로드한 문서를 참고하여 응답을 생성합니다.
Overview Diagram
![app-architecture-overview](https://private-user-images.githubusercontent.com/1788481/259589968-31a89bc6-bbd4-44e0-afb6-34d6a4b63c2e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTU4OTk2OC0zMWE4OWJjNi1iYmQ0LTQ0ZTAtYWZiNi0zNGQ2YTRiNjNjMmUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmU3ZWViZDVhY2Q5NDE4OGRmOGM5MWQ0YTlhOTQxNTU4ZThhM2U0YmE3YjFhOTdkOGU1YjkzNTRjODVkZTBmNiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.Z-PexWHiA_3X_hUg92fR94SLtJ7l1F8sprcuR4V6H2E)
- Chatbot Interface: 사용자와 상호작용 할 수 있는 Chatbot 형태의 인터페이스를 제공합니다.
- Generator: Prompt 를 생성해서 LLM 으로 부터 응답 생성을 요청합니다.
- Retriever: Prompt 생성에 팔요한 사용자의 질문과 가장 관련이 있는 문서를 검색합니다.
- Knowledge Source: 문서를 임베딩 벡터와 함께 저장합니다.
- LLM(Large Language Model): 응답을 생성합니다.
Module Diagram
![app-architecture-diagram](https://private-user-images.githubusercontent.com/1788481/259589962-cbed519c-9380-4887-808f-275635700948.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTU4OTk2Mi1jYmVkNTE5Yy05MzgwLTQ4ODctODA4Zi0yNzU2MzU3MDA5NDgucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NDliYTI4ZmRiYjQ1Mjg3YjJhOWRiNDg4NTM0NmE0NWY2M2RiOGI4YTNjNDI2YThiZjFiZjc0N2E2YmM0MzQ1ZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.nVthBgARA7ufGQ1vA0b-mdAuJ0UaCNDA5BGiKTc4A3Y)
Sequence Diagram
Store Documents
참고할 문서를 Chunk 단위로 나누고 Embedding Vector 로 변환하여 원본과 함께 저장합니다.
![app-architecture-sequence-01](https://private-user-images.githubusercontent.com/1788481/259681222-589dfe14-56d1-4efa-b079-c481c2bee165.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTY4MTIyMi01ODlkZmUxNC01NmQxLTRlZmEtYjA3OS1jNDgxYzJiZWUxNjUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGJkMWJlZTU0MTlkYTExMTNjOTEzMDM5ZjlkNDNmZGZhMWFmMDk1YzhjYTM2Yjc0ODU2YmMwOWU3MDNmZTlhMSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.WgPHtuCNmV2B2CtLTKJruzqOWVmL4JjAejuL1xbjcjE)
Delete Document
저장된 문서와 Embedding Vector 를 제거합니다.
![app-architecture-sequence-02](https://private-user-images.githubusercontent.com/1788481/259681239-6c9ce6d4-6b8b-44d3-9326-6b3315e3491d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTY4MTIzOS02YzljZTZkNC02YjhiLTQ0ZDMtOTMyNi02YjMzMTVlMzQ5MWQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NGM2ZTAwODEzYzUxMDc3ODBkYTUwZGE5ODkxY2Y5OTkzNDU5NDBiODUyNTIyMTg0MTNmNDAzOTZhOTRmMmE2ZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.hgqRdOjsZdI-784xD625sOjrlP6qhSNGDsWuC5PT09I)
Get Answer
질문과 연관된 문서를 찾아서 Prompt 를 만들어서 응답을 생성하는데 사용합니다.
![app-architecture-sequence-03](https://private-user-images.githubusercontent.com/1788481/259681246-3aad96ec-cd25-474d-8580-3589e2694194.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDc2NzA0MDksIm5iZiI6MTcwNzY3MDEwOSwicGF0aCI6Ii8xNzg4NDgxLzI1OTY4MTI0Ni0zYWFkOTZlYy1jZDI1LTQ3NGQtODU4MC0zNTg5ZTI2OTQxOTQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDIxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAyMTFUMTY0ODI5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjQxM2NmMDAwODBkYWI2ZjUxMGM3Yjc0NDdmYTIxZTQ5ODM5NjQxYTdhMTE2N2E2ODlhMGQxZDliNGU1MWNiZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.fcs6SGGMTaA0WaUTqEyR8iQZw7aW791TFGdqmYEaOCM)