| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 자연어 처리
- langsmith
- runnableparallel
- Multimodal
- 자연어처리
- chain생성
- splitter
- teddynote
- pdfloader
- azure ai
- Azure
- RecursiveCharacterTextSplitter
- Parallel
- webbaseloader
- Runnable
- rag
- runnablelambda
- azure services
- azure open ai service
- 챗봇 만들기
- csvloader
- GPT
- ai language
- azure open ai
- OpenAI
- 문서/번역 서비스 사용
- langchain
- runnablepassthrough
- azureai
- lcel
- Today
- Total
Nathaniel
3. Langchain LCEL, Parallel 본문
지난번 LCEL문법을 사용하여 Langchain의 chain을 진행했다.
유닉스 파이프를 인용한 " | " 문자를 사용해 chain을 만들었는데 그 구조는 아래와 같다.
chain = prompt | llm | Outputparser

stream = 실시간 출력으로 응답 받고
invoke = 출력되는 답변을 완성될 때까지 기다렸다가 한번에 받기
위 두 가지를 진행했었다.
Batch, max_concurrency
이번엔 batch(단위 실행) 여러 개의 딕셔너리를 포함하는 리스트를 인자로 받아서 딕셔너리에 있는
topic의 키 값을 사용한 일괄처리 수행방법이다.
answer = chain.batch([{"topic:": "ChatGPT"}, {"topic":"instagram"}]) 이런 방식이다.
그리고 변수로 선언한 answer의 인덱스 값들을 하나씩 불러와 실행하는 방법도 된다.
ex) answer[0], answer[1] 이런식으로말이다.
또한 max_concurrency 키를 통해 동시에 처리할 수 있는 최대 작업수를 설정한다.
아래와 같이, batch에 리스트 형식 내 Key:Value를 받고, config라는 변수에 "max_concurrency:3"로 답변출력을 받으면
5개의 topic에 대한 이야기를 3개의 답변으로 출력해준다
chain.batch(
[
{"topic": "ChatGPT"},
{"topic": "Instagram"},
{"topic": "멀티모달"},
{"topic": "프로그래밍"},
{"topic": "머신러닝"},
],
config={"max_concurrency": 3},
)
['ChatGPT는 자연어 처리 기술을 이용하여 대화 상대와 상호작용하는 인공지능 챗봇 서비스이다. 사용자는 ChatGPT를 통해 일상 대화, 질문 응답, 정보 제공 등의 다양한 상황에서 대화할 수 있다. ChatGPT는 일상적인 상황뿐만 아니라 전문적인 지식이 필요한 상황에서도 효과적으로 대응할 수 있는 특징을 가지고 있다.',
'인스타그램은 사진과 동영상을 공유하고 다른 사람들과 소통할 수 있는 소셜 미디어 플랫폼이다. 사용자들은 팔로워들과 이야기를 공유하며 인스타그램 스토리, 피드 포스트, 라이브 방송 등 다양한 기능을 활용할 수 있다. 또한 해시태그를 통해 관심사나 주제에 맞는 게시물을 검색하고 찾아볼 수 있다.',
'멀티모달은 여러 가지 형태의 통신 수단을 결합하여 정보를 전달하는 방법이다. 예를 들어 음성, 화상, 텍스트 등의 다양한 방식으로 소통할 수 있다. 멀티모달을 통해 더 효율적으로 의사소통하고 정보를 전달할 수 있어서 업무나 일상 생활에서 유용하게 활용된다.',
'프로그래밍은 컴퓨터에게 일련의 명령을 내리는 작업이다. 이를 통해 원하는 기능을 수행하거나 원하는 결과를 얻을 수 있다. 프로그래밍은 문제 해결 능력을 기르고 창의적인 사고를 발전시킬 수 있는 유용한 기술이다.',
'머신러닝은 컴퓨터 시스템이 데이터를 분석하여 패턴을 학습하고 예측하는 기술이다. 이러한 학습 과정을 통해 컴퓨터는 스스로 문제를 해결하고 최적의 결정을 내릴 수 있다. 머신러닝은 다양한 분야에서 활용되며 인공지능의 발전에 큰 역할을 한다.']
비동기 async
async stream : 비동기 스트림, async invoke : 비동기 호출
비동기는 여러개의 작업을 할 수 있게 하는 메서드라고 생각하면 된다(일괄처리)
GPT가 사용자가 특정 시간에 10명이서 답변 출력을 요청했을 때 10개의 답변을 GPT가 수행해야 하는데 이것을 비동기라고 생각하면된다.
비동기 호출은 invoke와 stream 앞 글자에 a를 붙인다 → ainvoke, astream
async for token in chain.astream({"topic": "YouTube"}):
# 메시지 내용을 출력합니다. 줄바꿈 없이 바로 출력하고 버퍼를 비웁니다.
print(token, end="", flush=True)
# 비동기 체인 객체의 'ainvoke' 메서드를 호출하여 'NVDA' 토픽을 처리합니다.
my_process = chain.ainvoke({"topic": "NVDA"})
비동기 async 사용하는 방법은 my_process에 ainvoke를 호출하고, await my_process를 하면 출력이된다.
# 비동기 체인 객체의 'ainvoke' 메서드를 호출하여 'NVDA' 토픽을 처리합니다.
my_process = chain.ainvoke({"topic": "NVDA"})
# 비동기로 처리되는 프로세스가 완료될 때까지 기다립니다.
await my_process
async batch : 비동기 배치
이제 위에서 했던 batch도 마찬가지로 abatch를 사용해서 코드를 짤 수 있다.
# 주어진 토픽에 대해 비동기적으로 일괄 처리를 수행합니다.
my_abatch_process = chain.abatch(
[{"topic": "YouTube"}, {"topic": "Instagram"}, {"topic": "Facebook"}]
)
# 비동기로 처리되는 일괄 처리 프로세스가 완료될 때까지 기다립니다.
await my_abatch_process
Parallel 병렬성
Runnable이란 무엇인가? 뜬금없지만 Runnable은 Langchain에서 Chain을 구성하는 prompt, llm, outputparser를 각 각 한개씩을 Runnable이라고 부르며 실행가능한 요소라고 칭한다.
+ invoke를 호출할 수 있다면, Runnable이다.
아래의 코드에서 보면 Chain1, Chain2가 있는데, 이 두 개의 Runnable을 병렬적으로 실행가능하게 하는 것이 RunnableParallel이다.
병렬 실행 체인 생성 combined = RunnableParallel(capital=chain1, area=chain2)
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)
chain1로 두 개 토픽 배치 처리
# 배치 처리를 수행합니다.
chain1.batch([{"country": "대한민국"}, {"country": "미국"}])
출력 : ['대한민국의 수도는 서울이다.', '미국의 수도는 워싱턴 D.C.입니다.']
chain2로 두 개 토픽 배치 처리
# 배치 처리를 수행합니다.
chain2.batch([{"country": "대한민국"}, {"country": "미국"}])
출력 : ['대한민국의 총 면적은 약 100,210km² 입니다.', '미국의 면적은 약 9,833,520km² 입니다.']
chain1, chain2를 combined로 합쳐 병렬처리하는 방식
# 주어진 데이터를 배치로 처리합니다.
combined.batch([{"country": "대한민국"}, {"country": "미국"}])
출력 :
[{'capital': '대한민국의 수도는 서울이다.', 'area': '대한민국의 면적은 약 100,363.438km² 입니다.'},
{'capital': '미국의 수도는 워싱턴 D.C.입니다.', 'area': '미국의 면적은 약 9,833,520㎢ (3,796,742제곱마일) 로 세계에서 세 번째로 큰 국가입니다.'}]
이렇게 병렬과 배치 처리를 통해서 답변을 한번에 밀어서 받는 것도 가능하다.
다음은 Runnable을 활용한 것들에 대해서 글을 작성해보려한다.
'AI' 카테고리의 다른 글
| 5. Lagnchain-prompt-template 생성 (0) | 2025.03.07 |
|---|---|
| 4. Runnable(Passthrough, Parallel,Lambda) (0) | 2025.03.02 |
| RAG 코드 암기하기 D1 (0) | 2025.02.26 |
| 2. Langchain → Chain 생성? (0) | 2025.02.26 |
| 1-1. GPT-4o 멀티모달 모델로 이미지 인식하여 답변 출력 (0) | 2025.02.25 |