Today I Learned (2024-07-12)
목차
오늘 공부한 내용
1. KDT (AWS)
EC2 (Elastic Compute Cloud)
AWS에서 제공하는 가상 서버 서비스
탄력적 컴퓨팅: 필요에 따라 인스턴스를 생성, 크기 조정, 종료 가능
온디맨드(Elastic): 사용한 만큼 비용 지불
지원 운영체제: Windows, Amazon Linux, Ubuntu 등
EBS(Elastic Block Store): 영구 블록 스토리지, 스냅샷 지원
인스턴스 유형에 따라 CPU, 메모리, 네트워크 성능을 조정할 수 있음
EC2 인스턴스 유형: T 시리즈(범용), M 시리즈(고성능), C 시리즈(컴퓨팅 최적화) 등 다양한 인스턴스 유형 제공
EC2 인스턴스 구성
- 인스턴스 스토어: 블록 수준 임시 스토리지, 인스턴스 수명 동안 지속
- EC2 Life Cycle:
- 실행중(Running): 인스턴스가 동작 중인 상태
- 정지됨(Stopped): 인스턴스가 중지된 상태로 과금 발생 안함
- 종료됨(Terminated): 인스턴스가 제거된 상태로 다시 시작할 수 없음
- AMI (Amazon Machine Image): 인스턴스 시작에 필요한 템플릿으로, 동일한 설정을 여러 인스턴스에 적용 가능
EBS (Elastic Block Store)
- 블록 스토리지: EC2 인스턴스에 연결할 수 있는 영구 블록 스토리지
- 고성능, 낮은 지연률, 데이터를 영구적으로 저장
- 스냅샷 기능: 백업을 위한 스냅샷 생성 가능
- 용량과 성능을 탄력적으로 조정 가능
- EBS 볼륨 유형: 범용 SSD, 프로비저닝된 IOPS SSD, 스루풋 최적화 HDD 등 다양한 유형 제공
Auto Scaling
- Auto Scaling: 트래픽 변화에 따라 인스턴스 수를 자동으로 조정
- Auto Scaling Group: 최소, 최대 인스턴스 수를 지정하여 관리
- 정책 기반 Auto Scaling: CPU 사용률 등 지표에 따라 인스턴스 추가 또는 제거
- 스케줄링 기반 Auto Scaling: 특정 시간에 맞춰 인스턴스 자동 조정
- 대규모 트래픽 증가에도 유연하게 대응 가능
Load Balancer
- Elastic Load Balancer: 여러 가용 영역에 걸쳐 트래픽을 자동으로 분산
- 고가용성 제공: 트래픽을 자동으로 조정하여 시스템 가용성을 극대화
- 대상 그룹: EC2 인스턴스, 컨테이너, Lambda 함수 등 다양한 서비스로 트래픽을 분배 가능
CloudWatch
- CloudWatch: AWS 리소스에 대한 모니터링 서비스
- 지표 수집 및 시각화: CPU, 메모리 사용량, 네트워크 트래픽 등의 지표를 실시간으로 모니터링
- 경보 설정: 특정 지표가 임계값을 초과할 때 경보를 발생시켜 자동 대응 가능
- 로그 관리: 애플리케이션 및 시스템 로그를 중앙에서 수집하고 분석
- 대시보드: 다양한 리소스의 상태를 하나의 화면에서 종합적으로 확인 가능
정리
- EC2: AWS 가상 서버 서비스, 블록 스토리지(EBS)와 함께 사용
- EBS: EC2 인스턴스에 영구 스토리지를 제공하며 스냅샷 기능을 지원
- Auto Scaling: 트래픽 변화에 따른 인스턴스 수 자동 조정
- Load Balancer: 네트워크 트래픽을 분산하여 고가용성 제공
- CloudWatch: AWS 리소스 모니터링 및 로그 관리 도구
2. ADsP
- 문제 풀기
3. LangChain
Prompt Template
LLM에게 지시사항을 주고 하는 질문
사용자의 입력 변수를 사용하여 완전한 프롬프트 문자열을 만드는 데 사용되는 템플릿
사용법 :
template : 템플릿 문자열. 이 문자열 내에서 중괄호
{}
는 변수를 나타낸다.input_variables : 중괄호 안에 들어갈 변수의 이름을 리스트로 정의
```python
template = """
당신은 흑백 요리사의 백종원 선생님입니다. 상황 [FORMAT]에 요리 레시피를 작성해 주세요.상황:
{question}FORMAT:
레시피 :
"""
LCEL(LangChain Expression Language)
# ChatOpenAI 임포트
from langchain_openai import ChatOpenAI
# 프롬프트 작성
prompt = PromptTemplate.from_template("{topic}에 대해 {how} 설명해주세요.")
# 모델 생성
model = ChatOpenAI(model='gpt-4o-mini')
# Chain = Prompt + model
chain = prompt | model
# 사용자 입력
input = {"topic":"인공지능 모델의 기능 고장","how":"인공지능을 아예 모르는 사람에게 쉽게"}
# 실행
chain.invoke(input)
|
기호는 unix 파이프 연산자와 유사하며, 다른 구성 요소를 연결하고 한 구성 요소의 출력을 다음 구성 요성의 입력에 전달
- invoke() 호출
- python 딕셔너리 형태로 입력값을 전달(키: 값)
- invoke() 함수 호출 시, 입력값을 전달
- 프롬프트에 정의한 변수가 있으면 반드시 채워 줘야한다.
- ❗ 변수가 1개일 경우 딕셔너리 형태로 안넣고 그냥 문자열로 넣어줘도 알아서 채워준다. 하지만 원칙상 딕셔너리 형태가 맞다.
출력파서(Output Parser)
- 출력 내용을 해석을 한다.
- AIMessage 에서 content 만 출력해준다.
chain = prompt | model | output_parser
- 실행 순서
- prompt → model → ouput_parset
- output_parse 유무 차이
input = {"topic":"인공지능 모델의 기능 고장","how":"인공지능을 아예 모르는 사람에게 쉽게"}
output parser 가 없으면
AIMessage
에 담겨서 출력된다.AIMessage(content='인공지능 모델의 기능 고장은 마치 우리가 사용하는 전자기기가 고장나는 것과 비슷합니다. 예를 들어, TV가 갑자기 화면이 안 나오거나, 스마트폰이 작동하지 않을 때가 있죠. 이런 경우, 기계 내부의 어떤 부분이 제대로 작동하지 않아서 문제를 일으키는 것입니다.\n\n인공지능도 마찬가지로, 데이터와 알고리즘을 사용해 작업을 수행하는 프로그램입니다. 하지만 가끔은 이 프로그램이 잘못된 데이터를 받거나, 알고리즘이 어떤 이유로 제대로 작동하지 않으면, 원하는 결과를 내지 못할 수 있습니다. \n\n예를 들어, 사진을 보고 사람을 인식하는 인공지능이 있다고 가정해볼게요. 만약 그 인공지능이 이상한 사진을 받거나, 데이터가 잘못되어 있다면, 사람을 잘못 인식하거나 아예 인식을 못할 수도 있습니다. \n\n즉, 인공지능의 기능 고장은 여러 가지 이유로 발생할 수 있으며, 이는 우리가 사용하는 기계가 고장나는 것과 비슷한 개념이라고 이해하면 됩니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 242, 'prompt_tokens': 31, 'total_tokens': 273, 'completion_tokens_details': {'audio_tokens': None, 'reasoning_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_482c22a7bc', 'finish_reason': 'stop', 'logprobs': None}, id='run-dc2dbf70-d378-4daf-bea1-e445fcc84202-0', usage_metadata={'input_tokens': 31, 'output_tokens': 242, 'total_tokens': 273, 'input_token_details': {'cache_read': 0}, 'output_token_details': {'reasoning': 0}})
AIMessage
의Content
만 출력된다.'인공지능 모델의 기능 고장이란, 우리가 기대하는 대로 인공지능이 제대로 작동하지 않는 상황을 말해요. 예를 들어, 우리가 인공지능에게 "고양이 사진 보여줘"라고 요청했는데, 인공지능이 고양이가 아닌 다른 사진을 보여준다면, 이건 기능 고장이라고 할 수 있어요.\n\n이런 문제가 생기는 이유는 여러 가지가 있어요. 인공지능이 학습할 때 사용한 데이터가 부족하거나 잘못된 정보가 포함되어 있을 수 있고, 또는 인공지능을 만드는 프로그램에 오류가 있을 수도 있어요. 간단히 말해서, 인공지능이 원하는 대로 일을 잘 하지 못하는 상황을 기능 고장이라고 이해하면 됩니다.'
템플릿안에 중괄호를 쓰고 싶다면
{{}}
이렇게 두개를 붙여주면 사용가능하다.template = """ 당신은 흑백 요리사의 백종원 선생님입니다. 상황에 [FORMAT]에 요리 레시피를 작성해 주세요. 상황: {{question}} FORMAT: - 레시피 : """
#
구분자를 통해 양식을 알려줄 수 있다.template = """ 당신은 흑백 요리사의 백종원 선생님입니다. 상황에 [FORMAT]에 요리 레시피를 작성해 주세요. # 상황: {{question}} # FORMAT: - 레시피 : """
LCEL 인터페이스
stream : 응답의 청크를 스트리밍한다..
스트림을 반복하여 각 데이터의 내용(context)을 즉시 출력한다.
end=""인자는 출력 후 줄바꿈을 하지 않도록 설정
flush=True 인자는 출력 버퍼를 즉시 비우도록 한다.
for token in chain.stream("비행기"): print(token,end="",flush=True)
invoke : 입력에 대해 체인을 호출한다.
답변만 한 번에 출력한다.
chain.invoke("비행기")
batch : 입력 목록에 대해 체인을 호출한다.
한 번에 여러개의 요청을 할때 사용하면 유용하다.
answer = chain.batch( [ {"tech": "ChatGPT"}, {"tech": "Instagram"}, {"tech": "멀티모달"}, {"tech": "프로그래밍"}, {"tech": "머신러닝"}, ], config={"max_concurrency": 3}, )
LCEL 비동기(async)
프로그램이 특정 작업을 수행하고 있을 때, 그 작업이 완료될 때까지 프로그램 전체를 멈추지 않고 다른 작업을 계속 수행할 수 있게 해주는 방법이다.
즉, 작업의 완료를 기다리는 동안 다른 코드의 실행이 가능하다.
LCEL 비동기 종류
async stream : 비동기 스트림
- chain.astream 은 비동기 스트림을 생성하며, 주어진 토픽에 대한 정보를 비동기적으로 처리한다.
- 비동기 for루프(async for)를 사용하여 스트림에서 메시지를 순차적으로 받아오고, print 함수를 통해 메시지의 내용(content)를 즉시 출력한다.
async for token in chain.astream({"tech":"나무망치"}): print(token,end="",flush=True)
async invoke : 비동기 호출
- chain 객체의
ainvoke
메서드는 비동기적으로 주어진 인자를 사용하여 작업을 수행한다. - await 로 실행한다.
async_process = chain.ainvoke({"tech":"맥북"})
await async_process
- chain 객체의
async batch : 비동기 배치
abatch
비동기적으로 일련의 작업을 일괄 처리- await 로 실행한다.
async_batch = chain.abatch( [ {"tech": "ChatGPT"}, {"tech": "Instagram"}, ], )
await async_batch
Parallel : 병렬성
Runnable 을 병렬적으로 실행시킨다.
from langchain_core.runnables import RunnableParallel # {tech} 사용법 chain1 = ( PromptTemplate.from_template("{tech} 의 사용법은 뭐야?") | model | StrOutputParser() ) # {tech} 구매처 chain2 = ( PromptTemplate.from_template("{tech} 의 구매처는 어디야?") | model | StrOutputParser() ) combined = RunnableParallel(use=chain1,buy=chain2) combined.invoke({"tech":"고무줄"})
{'use': '고무줄은 다양한 용도로 사용되는 유용한 도구입니다. 여기 몇 가지 일반적인 사용법을 소개합니다:\n\n1. **물건 묶기**: 고무줄은 여러 물건을 함께 묶는 데 유용합니다. 예를 들어, 종이를 묶거나 여러 개의 연필을 함께 고정할 때 사용합니다.\n\n2. **서류 정리**: 서류나 문서를 정리할 때 고무줄을 사용하여 묶어두면 쉽게 보관할 수 있습니다.\n\n3. **임시 고정**: 어떤 물체를 일시적으로 고정할 필요가 있을 때, 고무줄을 사용하여 간편하게 고정할 수 있습니다. 예를 들어, 먼지나 이물질이 들어가지 않도록 물건을 덮을 때 사용합니다.\n\n4. **DIY와 공예**: 고무줄은 공예 프로젝트나 DIY 작업에서도 자주 사용됩니다. 예를 들어, 고무줄을 이용해 다양한 형태를 만들거나 색상을 조합할 수 있습니다.\n\n5. **운동 용품**: 고무줄은 운동 용품으로도 활용됩니다. 저항 밴드로 사용하여 근력 운동을 할 때 사용되기도 합니다.\n\n6. **음식 포장**: 식품 포장에도 사용됩니다. 예를 들어, 남은 음식을 포장할 때 고무줄을 이용해 밀폐할 수 있습니다.\n\n이처럼 고무줄은 일상생활에서 매우 다양한 용도로 사용될 수 있는 유용한 아이템입니다.', 'buy': '고무줄은 다양한 장소에서 구매할 수 있습니다. 아래는 몇 가지 구매처입니다:\n\n1. **문구점**: 일반적인 문구점에서는 다양한 크기의 고무줄을 판매합니다.\n2. **온라인 쇼핑몰**: 쿠팡, G마켓, 11번가 등 다양한 온라인 쇼핑몰에서 고무줄을 쉽게 구매할 수 있습니다.\n3. **대형 마트**: 이마트, 롯데마트와 같은 대형 마트에서도 고무줄을 찾아볼 수 있습니다.\n4. **사무용품 전문점**: 사무용품을 전문으로 하는 매장에서도 고무줄을 판매합니다.\n\n필요한 크기나 종류에 따라 적절한 구매처를 선택하면 좋습니다!'}
배치에서 병렬 처리
combined.batch(([{"tech":"에어팟"},{"tech":"후추"}]))
[{'use': '에어팟은 Bluetooth 기능이 있는 기기와 연결하여 음악을 듣거나 전화를 받을 수 있으며, 이어폰을 귀에 꽂으면 자동으로 연결되고, 터치 또는 제스처로 다양한 기능을 조작할 수 있습니다.', 'buy': '에어팟은 애플 공식 웹사이트, 애플 스토어, 전자제품 매장 및 온라인 쇼핑몰에서 구매할 수 있습니다.'}, {'use': '후추는 음식에 풍미를 더하고, 소화를 촉진하며, 향신료로 다양한 요리의 맛을 개선하는 데 사용됩니다.', 'buy': '후추는 대형 마트, 온라인 쇼핑몰, 또는 지역 식료품점에서 구매할 수 있습니다.'}]
어려웠던 내용
- AWS
궁금한 내용과 부족한 내용
- LangChain 의 활용
느낀 점
- 앞으로 어떻게 Chain을 결합해서 어떤 프로그램을 만들지 기대가 된다.
'TIL (2024) > 2024.10' 카테고리의 다른 글
[TIL] 2024-10-24 (AWS/LangChain/ADsP) (0) | 2024.10.25 |
---|---|
[TIL] 2024-10-23 (AWS/LangChain/ADsP) (0) | 2024.10.24 |
[TIL] 2024-10-12 (Network/AWS/ADsP/LangChain) (4) | 2024.10.22 |
[TIL] 2024-10-20 (ADsP) (0) | 2024.10.21 |
[TIL] 2024-10-19 (ADsP) (0) | 2024.10.21 |
배움에 즐거움을 느끼는 마네의 연구소입니다. 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!