LCEL 인터페이스
Runnable 프로토콜로 구현됨
: 이는 표준 인터페이스임
: 다음이 포함됨
- stream
- invoke
- batch
batch
variable을 2개라고 하면
batch 단위로 묶어서 동시에 실행함
그래서 좀 더 오래 걸림
-> 질문을 한 번에 여러개 처리할 때 사용함
# 주어진 토픽 리스트를 batch 처리하는 함수 호출
chain.batch([{"topic": "ChatGPT"}, {"topic": "Instagram"}])
['ChatGPT는 OpenAI에서 개발한 자연어 처리 모델로, 대화형 인공지능 채팅 시스템입니다. 이 모델은 사람과 자연스럽고 의미 있는 대화를 할 수 있으며, 다양한 주제에 대해 정보를 제공하고 질문에 답변할 수 있습니다. ChatGPT는 인간과의 상호작용을 통해 계속 발전하고, 다양한 분야에서 유용하게 활용될 수 있는 기술입니다.',
'인스타그램은 사진과 동영상을 공유하고 소셜 네트워크 서비스를 제공하는 앱이다. 사용자들은 다른 사람들의 게시물을 좋아하고 댓글을 남기며 소통할 수 있다. 또한 해시태그를 활용하여 관심사에 맞는 게시물을 검색하고 팔로우할 수 있다.']
파라미터 config
: config={"max_concurrency"}
동시에 처리하는 최대 작업수
답변은 동일하게 5개 나오는데 한 번에 3개를 작업하는 것임
chain.batch(
[
{"topic": "ChatGPT"},
{"topic": "Instagram"},
{"topic": "멀티모달"},
{"topic": "프로그래밍"},
{"topic": "머신러닝"},
],
config={"max_concurrency": 3},
)
['ChatGPT는 OpenAI에서 개발된 자연어 처리 모델로, 대화형 인공지능 채팅을 가능하게 합니다. 이 모델은 다양한 주제에 대해 대화를 나누며 사용자에게 도움을 주거나 정보를 제공할 수 있습니다. ChatGPT는 사용자와의 상호작용을 통해 학습하며, 계속해서 발전하고 성능을 향상시키고 있습니다.',
'Instagram은 사진과 동영상을 공유하고 소셜 네트워크 서비스를 제공하는 애플리케이션입니다. 사용자들은 다양한 필터와 효과를 통해 자신의 콘텐츠를 꾸밀 수 있고, 팔로워들과 소통하며 소셜 미디어 플랫폼으로 활용합니다. 또한 인플루언서나 브랜드들이 제품 홍보나 마케팅을 위해 활발히 활용하는 플랫폼이기도 합니다.',
'멀티모달은 여러 가지 방식의 입력과 출력 수단을 결합하여 사용자와 컴퓨터 간의 상호작용을 더 풍부하고 효율적으로 만드는 기술입니다. 이는 음성, 터치, 제스처, 시각 등 다양한 입력 방식을 조합하여 사용자 경험을 향상시키고, 정보를 보다 효과적으로 전달할 수 있도록 합니다. 멀티모달 기술은 사용자의 다양한 환경과 상황에 맞게 최적화된 상호작용을 제공하여 보다 편리하고 자연스러운 경험을 제공합니다.',
'프로그래밍은 컴퓨터에게 작업을 수행하도록 지시하는 일련의 명령어를 작성하는 과정입니다. 이러한 명령어는 주로 프로그래밍 언어를 사용하여 작성되며, 이를 통해 다양한 소프트웨어 및 애플리케이션을 개발할 수 있습니다. 프로그래밍은 문제 해결 및 창의적인 사고를 향상시키는 데 도움이 되며, 현대 사회에서 중요한 기술 중 하나로 자리 잡고 있습니다.',
'머신러닝은 컴퓨터가 데이터를 학습하고 패턴을 발견하여 예측하거나 의사결정을 내리는 인공지능 기술이다. 이를 위해 다양한 알고리즘이 사용되며, 데이터의 양과 품질이 중요한 역할을 한다. 머신러닝은 텍스트 분석, 이미지 인식, 음성 인식 등 다양한 분야에서 활용되고 있다.']
async stream 비동기 스트림
개발자한테는 익숙한 개념
컴퓨터 프로그래밍에서 유용함
예시) 커피숍
동기 방식
: 한 번에 하나의 작업만 함
커피 주문을 함, 커피가 나올때까지 그 자리에서 기다림
종료되는 시점까지 아ㅜ무것도 하지 않음
<->
비동기 방식
커피 주문하고 다른 작업을 함 (친구와 대화, 카톡, 독서)
종료될때까지 다른 작업을 수행함
=> 비동기를 많이 함
chain도 async 비동기 방식을 지원함
실제로 서비스 구현할 때 고려함
: 한 두사람이 쓸 것이 목적이 아님
10명이 요청이 오면 굉장히 마지막 사람이 계속 기다려야 함
비동기 메소드
astream
# 비동기 스트림을 사용하여 'YouTube' 토픽의 메시지를 처리합니다.
async for token in chain.astream({"topic": "YouTube"}):
# 메시지 내용을 출력합니다. 줄바꿈 없이 바로 출력하고 버퍼를 비웁니다.
print(token, end="", flush=True)
YouTube는 구글이 소유하고 있는 동영상 공유 플랫폼으로, 사용자들은 영상을 업로드하고 시청할 수 있습니다. 또한 광고 수익을 얻을 수 있는 유튜버들이 많이 활동하고 있으며, 다양한 콘텐츠를 제공하고 있습니다. YouTube는 세계적으로 가장 인기 있는 온라인 비디오 플랫폼 중 하나로, 수많은 사용자들이 일상생활에서 영상을 시청하고 공유하는데 이용하고 있습니다.
ainvoke
awit 호출 했을 때 비로소 답변을 받음
topic이라는 키, NVDA 값을 가진 딕셔너리를 인자로 전달함
# 비동기 체인 객체의 'ainvoke' 메서드를 호출하여 'NVDA' 토픽을 처리합니다.
my_process = chain.ainvoke({"topic": "NVDA"})
# 비동기로 처리되는 프로세스가 완료될 때까지 기다립니다.
await my_process
'NVDA는 NVIDIA Corporation의 주식 심볼로, 미국의 그래픽 처리 장치 제조업체이다. NVDA 주식은 기술 기업 주식 중에서 인기 있는 투자 대상 중 하나이며, 주가는 기술 시장의 동향에 영향을 받는다. 회사는 게임 산업을 비롯한 다양한 분야에서 혁신적인 제품을 개발하여 글로벌 시장에서 선도적인 역할을 하고 있다.'
abatch
# 주어진 토픽에 대해 비동기적으로 일괄 처리를 수행합니다.
my_abatch_process = chain.abatch(
[{"topic": "YouTube"}, {"topic": "Instagram"}, {"topic": "Facebook"}]
)
# 비동기로 처리되는 일괄 처리 프로세스가 완료될 때까지 기다립니다.
await my_abatch_process
['YouTube는 구글이 소유하는 동영상 공유 플랫폼으로, 사용자들은 영상을 업로드하고 시청할 수 있다. 다양한 콘텐츠를 제공하며, 뉴스, 음악, 게임, 뷰티 등 다양한 주제의 영상을 즐길 수 있다. 또한 광고 수익을 얻을 수 있는 유튜버들이 활발히 활동하고 있어 인기를 끌고 있다.',
'Instagram은 사진과 동영상을 공유하는 소셜 미디어 플랫폼으로, 사용자들은 다른 사람의 게시물을 좋아하고 댓글을 남길 수 있습니다. 또한 해시태그를 활용하여 관심사에 맞는 게시물을 찾을 수 있습니다. 인스타그램 스토리 기능을 통해 24시간 동안 임시적으로 사진이나 동영상을 공유할 수도 있습니다.',
'페이스북은 전 세계적으로 가장 대중적인 소셜 네트워크 서비스 중 하나로 사용자들이 친구들과 소통하고 소셜 미디어 콘텐츠를 공유할 수 있는 플랫폼이다. 사용자들은 텍스트, 사진, 동영상 등 다양한 형식의 콘텐츠를 게시하며 그룹이나 페이지를 통해 관심사를 공유하고 소통할 수 있다. 또한 광고 및 비즈니스 기회를 제공하여 기업들도 홍보 및 마케팅에 활용하고 있다.']
astream_log
Pararllel 병렬성
Runnerable
사용자 정의 체인을 최대한 쉽게 만들 수 있도록 함
체인을 묶을 때
chain = p | l | o 임
이 하나하나의 모듈이 runnable 프로토콜을 함
즉, 프롬프트, llm , out, 파서가 다 될 수 있음
이 모든것들이 runnable임
이런 runnable을 묶어서 chain을 구성함
그럼 runableparallel은 chain자체를 병렬적으로 실행하게 하는 것임
두 개의 chain을 동시에 실행할 것임
1. 수도를 물어보는 체임
2. 면적은 얼마인지?
from langchain_core.runnables import RunnableParallel
# {country} 의 수도를 물어보는 체인을 생성합니다.
chain1 = (
PromptTemplate.from_template("{country} 의 수도는 어디야?")
| model
| StrOutputParser()
)
# {country} 의 면적을 물어보는 체인을 생성합니다.
chain2 = (
PromptTemplate.from_template("{country} 의 면적은 얼마야?")
| model
| StrOutputParser()
)
# 위의 2개 체인을 동시에 생성하는 병렬 실행 체인을 생성합니다.
combined = RunnableParallel(capital=chain1, area=chain2)
country에 대한민국을 입력해서 치환되면
chain 1에 수도 나오고
chain 2에 면적이 나온 것임
그래서 country를 하나만 넣어도 ㄱㄴ
# 병렬 실행 체인을 실행합니다.
combined.invoke({"country": "대한민국"})
{'capital': '대한민국의 수도는 서울이야.', 'area': '대한민국의 면적은 약 100,363 제곱 킬로미터 입니다.'}
chain 1, 2 각각 다른 country 값을 넣을 수 있음
# chain1 를 실행합니다.
chain1.invoke({"country": "대한민국"})
'대한민국의 수도는 서울입니다.'
# chain2 를 실행합니다.
chain2.invoke({"country": "미국"})
'미국의 면적은 약 9,826,675 제곱 킬로미터입니다.'
다른 경우
chain1, chain2에 input_variable을 country1, country2로 다르게 넣는 경우도 있음
from langchain_core.runnables import RunnableParallel
# {country} 의 수도를 물어보는 체인을 생성합니다.
chain1 = (
PromptTemplate.from_template("{country1} 의 수도는 어디야?")
| model
| StrOutputParser()
)
# {country} 의 면적을 물어보는 체인을 생성합니다.
chain2 = (
PromptTemplate.from_template("{country2} 의 면적은 얼마야?")
| model
| StrOutputParser()
)
# 위의 2개 체인을 동시에 생성하는 병렬 실행 체인을 생성합니다.
combined = RunnableParallel(capital=chain1, area=chain2)
# 이럴 때는 country1, country2로 딕셔너리 만들어서 키만 잘 지정하면 됨
combined.invoke({"country1": "대한민국", "country2":"미국"})
{'capital': '대한민국의 수도는 서울입니다.', 'area': '미국의 면적은 약 9,833,520km² 입니다.'}
배치에서 병렬처리
# 배치 처리를 수행합니다.
chain1.batch([{"country": "대한민국"}, {"country": "미국"}])
['서울이야.', '미국의 수도는 워싱턴 D.C.입니다.']
# 배치 처리를 수행합니다.
chain2.batch([{"country": "대한민국"}, {"country": "미국"}])
['대한민국의 총 면적은 약 100,363km² 입니다.', '미국의 면적은 약 9,833,520 km² 입니다.']
# 주어진 데이터를 배치로 처리합니다.
combined.batch([{"country": "대한민국"}, {"country": "미국"}])
[{'capital': '대한민국의 수도는 서울이다.', 'area': '대한민국의 총 면적은 약 100,363 km² 입니다.'},
{'capital': '미국의 수도는 워싱턴 D.C. (District of Columbia)입니다.',
'area': '미국의 면적은 약 9,833,520 제곱 킬로미터입니다.'}]'RangChain' 카테고리의 다른 글
| 0201 강의 Part.2 Ch.1 11~13 파일 01-01 partial_variables,ChatPromptTemplate, MessagePlaceholder (0) | 2025.01.25 |
|---|---|
| 강의 Ch.4 11~13 파일 05-Runnable (0) | 2025.01.18 |
| 강의 Ch4.03~07, 파일 03-LCEL : 멀티모달 모델, 프롬프트 템플릿, 변형 (0) | 2025.01.17 |
| Ch.4 LangChain 주요 파라미터, 기본 llm 생성 코드, LogProb, Streaming, Langsmith 추적 (0) | 2025.01.17 |
| Ch.3 model/ Token, 토큰 계산기/ Context Window, 출력 토큰 (0) | 2025.01.17 |