본문 바로가기
AI/Bedrock

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

by J's Note 2023. 10. 18.

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)

이번에는 AWS Bedrock을 API로 호출하는 기본적인 방법에 대해 진행해보려고 합니다.

개발 환경은 VScode를 사용하며, 런타임은 Boto3 라이브러리가 설치된 Python3 환경입니다.

 

파이썬 스크립트 작성하기

기본적으로 import 해야 할 라이브러리를 import 합니다.

import json
import boto3

 

베드락 클라이언트를 초기화 하도록 하겠습니다.

파라미터로 전달되는 enpoint_url 은 리전별로 다르므로 해당 🔗링크를 확인해주세요. 본 가이드에서는 버지니아를 사용합니다.

session = boto3.Session()

bedrock = session.client(
    service_name='bedrock-runtime',
    region_name='us-east-1',
    endpoint_url="https://bedrock-runtime.us-east-1.amazonaws.com"
)

 

API를 요청하기위한 페이로드를 설정하도록 하겠습니다. 사용할 모델과 프롬프트, 모델(ai21.j2-ultra-v1)에서 필요로 하는 파라미터를 설정하겠습니다.

bedrock_model_id = "ai21.j2-ultra-v1"

prompt = "What is the largest city in New Hampshire?"

body = json.dumps({
    "prompt": prompt, #AI21
    "maxTokens": 1024, 
    "temperature": 0, 
    "topP": 0.5, 
    "stopSequences": [], 
    "countPenalty": {"scale": 0 }, 
    "presencePenalty": {"scale": 0 }, 
    "frequencyPenalty": {"scale": 0 }
})

 

API를 호출하고 리스폰스를 받아 출력합니다.

response = bedrock.invoke_model(body=body, modelId=bedrock_model_id, accept='application/json', contentType='application/json') #send the payload to Bedrock
response_body = json.loads(response.get('body').read())
response_text = response_body.get("completions")[0].get("data").get("text")
print(response_text)


전체 코드는 다음과 같습니다.

import json
import boto3

session = boto3.Session()

bedrock = session.client(
    service_name='bedrock-runtime',
    region_name='us-east-1',
    endpoint_url="https://bedrock-runtime.us-east-1.amazonaws.com"
) 

bedrock_model_id = "ai21.j2-ultra-v1"

prompt = "What is the largest city in New Hampshire?"

body = json.dumps({
    "prompt": prompt, #AI21
    "maxTokens": 1024, 
    "temperature": 0, 
    "topP": 0.5, 
    "stopSequences": [], 
    "countPenalty": {"scale": 0 }, 
    "presencePenalty": {"scale": 0 }, 
    "frequencyPenalty": {"scale": 0 }
})


response = bedrock.invoke_model(body=body, modelId=bedrock_model_id, accept='application/json', contentType='application/json') #send the payload to Bedrock
response_body = json.loads(response.get('body').read())
response_text = response_body.get("completions")[0].get("data").get("text")
print(response_text)

🦜🔗LangChain 라이브러리 사용해보기

🦜🔗LangChain은 LLM 모델과 애플리케이션의 통합을 간소화하는 SDK입니다. Bedrock 또한 지원하기때문에, 이번에는 LangChain을 사용하여 API를 호출해보도록 하겠습니다.

 

Langchain 라이브러리를 설치합니다.

pip3 install langchain

 

파이썬 스크립트를 작성하겠습니다. 랭체인라이브러리에서 Bedrock을 임포트합니다.

from langchain.llms.bedrock import Bedrock

 

베드락 클라이언트를 초기화합니다.

llm = Bedrock(
    region_name='us-east-1'
    endpoint_url="https://bedrock-runtime.us-east-1.amazonaws.com"
    model_id="ai21.j2-ultra-v1"
)

 

프롬프트를 설정하고 response를 출력해봅니다.

prompt = "What is the largest city in Vermont?"
response_text = llm.predict(prompt)
print(response_text)

 

전체 코드는 다음과 같습니다. 코드의 라인수를 거의 50%이상 줄인 효과가 있네요

from langchain.llms.bedrock import Bedrock
llm = Bedrock(
    region_name='us-east-1',
    endpoint_url="https://bedrock-runtime.us-east-1.amazonaws.com",
    model_id="ai21.j2-ultra-v1"
)
prompt = "What is the largest city in Vermont?"
response_text = llm.predict(prompt)
print(response_text)