AI/Bedrock

Amazon Bedrock, LangChain과 사용하기 - 1. Amazon Bedrock, 개발환경 설정

J's Note 2023. 10. 18. 10:50

Amazon Bedrock, LangChain과 사용하기

1. Amazon Bedrock, 개발환경 설정

2. Amazon Bedrock API, LangChain 사용해보기

3. 추론 매개변수

4. 스트리밍 API, 벡터 임베딩

5. Streamlit, 텍스트/이미지 생성

6. 간단한 검색증강(RAG : Retrieval Augmented Generation) 구현

7. 간단한 챗봇 구현 (Conversation Memory)

8. 챗봇 구현 (RAG + Conversation Memory)

 

아마존 베드락은 API를 통해 Amazon 및 타사 모델 공급자의 기본모델(Foundation Models, FM)에 액세스 할 수 있도록하는 완전관리형 서비스입니다.

 

사용할 수 있는 모델은 다음과 같습니다.

  • AI21 Labs
    • Jurassic-2 Ultra
    • Jurassic-2 Mid
  • Amazon
    • Titan Text G1 - Express
    • Titan Embeddings G1 - Text
  • Anthropic
    • Claude v1.x
    • Claude v2.x
    • Claude Instant v1.x
  • Cohere
    • Command
  • Stability.ai
    • Stable Diffusion XL 0.x
    • Stable Diffusion XL 1.x

사용할 수 있는 모델은 cli 혹은 boto3 라이브러리를 통해 조회할 수 있습니다.

 

사용할수 있는 리전은 US East (N. Virginia), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Tokyo) 입니다. 각 리전마다 지원하는 모델이 다를 수 있으므로 조회한 후 사용하는것을 추천드립니다. 또한, 아직 한국은 지원하지 않는 상황인데요, Seoul 리전도 얼른 추가되면 좋겠네요. 이점을 유의해서 aws configure등으로 미리 설정된 default 프로파일이 ap-northeast-2 (Seoul) 로 지정되어있는 경우 region을 꼭 설정 해줘야합니다.

 

베드락 설정

본 포스팅에서는 us-east-1 (버지니아)를 사용하여 진행하도록 하겠습니다. 🔗콘솔 로 이동하여 모델 엑세스 설정을 해보겠습니다.

Edit을 누르고 모든 모델에 엑세스를 설정합니다.

개발환경 설정

본 포스팅에서는 MacOS 환경에 맞게 진행되었으나, Windows에서 진행하여도 무방합니다.

🔗IAM콘솔로 이동하여 API사용을 위한 계정 API키와 Secret키를 설정해보도록 하겠습니다. 사용자를 선택합니다. 사용자가 없다면, 사용자를 하나 만들어주되, 권한 정책으로 AdministartorAccess를 설정하시거나, Bedrock 관련 정책을 추가해주세요.

액세스 키를 생성해줍니다.

생성된 액세스키는 AKIA로 시작하는 String과 해싱처리된 Secret키 입니다. 두 항목을 잃어버리지 않게 유의해주세요. 잃어버리면 다시 생성을 해야합니다.

 

생성된 키를가지고, aws-cli를 설정하도록 하겠습니다. 홈브류를 통해 설치합니다.

brew install awscli

 

설치 후 aws credentials를 설정합니다. 이때 AccessKey와 SecretKey는 위에서 생성한 값을 사용합니다.

Default region과 output format은 비워두고 진행하면 됩니다.

aws configure
AWS Access Key ID : 
AWS Secret Access Key : 
Default region name : 
Default output format :

 

파이썬 aws sdk인 boto3 라이브러리를 설치합니다.

pip3 install boto3

 

파이썬 런타임 실행 후 boto3 라이브러리를 사용하여 bedrock api가 호출되는지 확인합니다.

import boto3 
bedrock = boto3.client(service_name='bedrock', region_name = 'us-east-1')
bedrock.list_foundation_models()

 

다음과 같이 출력된다면, 환경이 정상적으로 구성되었음을 확인할 수 있습니다.

Python 3.11.6 (main, Oct  2 2023, 13:45:54) [Clang 15.0.0 (clang-1500.0.40.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3 
>>> bedrock = boto3.client(service_name='bedrock', region_name = 'us-east-1')
>>> bedrock.list_foundation_models()
{'ResponseMetadata': {'RequestId': '4944d9a1-fd53-46e7-acdb-9116c07ac865', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Wed, 18 Oct 2023 01:47:34 GMT', 'content-type': 'application/json', 'content-length': '5729', 'connection': 'keep-alive', 'x-amzn-requestid': '4944d9a1-fd53-46e7-acdb-9116c07ac865'}, 'RetryAttempts': 0}, 'modelSummaries': [{'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-tg1-large', 'modelId': 'amazon.titan-tg1-large', 'modelName': 'Titan Text Large', 'providerName': 'Amazon', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': ['FINE_TUNING'], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-e1t-medium', 'modelId': 'amazon.titan-e1t-medium', 'modelName': 'Titan Text Embeddings', 'providerName': 'Amazon', 'inputModalities': ['TEXT'], 'outputModalities': ['EMBEDDING'], 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-g1-text-02', 'modelId': 'amazon.titan-embed-g1-text-02', 'modelName': 'Titan Text Embeddings v2', 'providerName': 'Amazon', 'inputModalities': ['TEXT'], 'outputModalities': ['EMBEDDING'], 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1', 'modelId': 'amazon.titan-text-express-v1', 'modelName': 'Titan Text G1 - Express', 'providerName': 'Amazon', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1', 'modelId': 'amazon.titan-embed-text-v1', 'modelName': 'Titan Embeddings G1 - Text', 'providerName': 'Amazon', 'inputModalities': ['TEXT'], 'outputModalities': ['EMBEDDING'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl', 'modelId': 'stability.stable-diffusion-xl', 'modelName': 'Stable Diffusion XL', 'providerName': 'Stability AI', 'inputModalities': ['TEXT', 'IMAGE'], 'outputModalities': ['IMAGE'], 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v0', 'modelId': 'stability.stable-diffusion-xl-v0', 'modelName': 'Stable Diffusion XL', 'providerName': 'Stability AI', 'inputModalities': ['TEXT', 'IMAGE'], 'outputModalities': ['IMAGE'], 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-grande-instruct', 'modelId': 'ai21.j2-grande-instruct', 'modelName': 'J2 Grande Instruct', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-jumbo-instruct', 'modelId': 'ai21.j2-jumbo-instruct', 'modelName': 'J2 Jumbo Instruct', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid', 'modelId': 'ai21.j2-mid', 'modelName': 'Jurassic-2 Mid', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid-v1', 'modelId': 'ai21.j2-mid-v1', 'modelName': 'Jurassic-2 Mid', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra', 'modelId': 'ai21.j2-ultra', 'modelName': 'Jurassic-2 Ultra', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra-v1', 'modelId': 'ai21.j2-ultra-v1', 'modelName': 'Jurassic-2 Ultra', 'providerName': 'AI21 Labs', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': False, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1', 'modelId': 'anthropic.claude-instant-v1', 'modelName': 'Claude Instant', 'providerName': 'Anthropic', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v1', 'modelId': 'anthropic.claude-v1', 'modelName': 'Claude', 'providerName': 'Anthropic', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2', 'modelId': 'anthropic.claude-v2', 'modelName': 'Claude', 'providerName': 'Anthropic', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}, {'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/cohere.command-text-v14', 'modelId': 'cohere.command-text-v14', 'modelName': 'Command', 'providerName': 'Cohere', 'inputModalities': ['TEXT'], 'outputModalities': ['TEXT'], 'responseStreamingSupported': True, 'customizationsSupported': [], 'inferenceTypesSupported': ['ON_DEMAND']}]}
>>>