오늘의 실습
LangChain Expression Language(LCEL)
가장 일반적인 사용법으로, prompt와 모델을 연결하여 출력하는 방식으로 f-string 형태로, 변수를 `{}`로 감싸서 입력을 넣어주면 된다.
from langchain_core.prompts import PromptTemplate
template = "{country}의 가장 부자는 누구인가요"
prompt_template = PromptTemplate.from_template(template)
print(prompt_template)
>> PromptTemplate(input_variables=['country'], input_types={}, partial_variables={}, template='{country}의 가장 부자는 누구인가요')
prompt를 생성한 후에는 chain을 이용해서 모델과 연결해주면연결해 주면 된다. chain을 연결한다는 것이 langchain의 핵심인데, 어떤 input이 들어오면 prompt를 거치고, 모델을 거친다라는 단순한 것 같다. 기호는 `|`를 이용해서 연결해 주면 된다.
chain = prompt_template | llama
answer = chain.stream(input={"country": "대한민국"})
for token in answer:
print(token.content, end="", flush=True)
invoke
invoke는 python 딕셔너리형태로 key와 value를 지정해서 전다하고, 만약 template의 인자가 하나라면 value만 넘겨줘도 된다.
steam함수는 invoke함수를 `yield`를 이용해서 출력하는 방식이다.
chain = prompt_template | llama | StrOutputParser()
chain.invoke(input={"country": "대한민국"})
batch
여러개의 딕셔너리를 포함하는 리스트를 인자로 받아서, 처리를 진행한다. 이때 `max_concurrency`인자를 이용하여 동시에 처리할 수 있는 작업 수를 제한할 수도 있다.
chain = prompt_template | llama | StrOutputParser()
chain.batch([{"country": "대한민국"},{"country": "미국"}])
>> ['대한민국의 가장 부자는 정의가 명확하지 않습니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람들은 다음과 같습니다.\n\n1. **Lee Jae-yong**: 한국의 LG 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 10위에 올랐습니다.\n2. **Koo Cha-bong**: 한국의 SK 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 20위에 올랐습니다.\n3. **Lee Kun-hee**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 30위에 올랐습니다.\n4. **Choi Tak**: 한국의 Samsung Electronics 사장으로, 2022년 Forbes 세계의 가장 부유한 사람 40위에 올랐습니다.\n5. **Lee Jae-hoon**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 50위에 올랐습니다.\n\n이러한 사람들은 한국의 산업계에서 중요한 역할을 하고 있으며, 한국의 경제에 큰 영향을 미칩니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람은 정의가 명확하지 않으며, 다양한 출처에서 다른 사람들을 포함하여 달라질 수 있습니다.\n\n2022년 Forbes 세계의 가장 부유한 사람 100위에 올랐던 한국의 richest인들은 다음과 같습니다.\n\n1. Lee Jae-yong (LG 그룹)\n2. Koo Cha-bong (SK 그룹)\n3. Lee Kun-hee (Hyundai Motor Group)\n4. Choi Tak (Samsung Electronics)\n5. Lee Jae-hoon (Hyundai Motor Group)\n\n이러한 사람들은 한국의 산업계에서 중요한 역할을 하고 있으며, 한국의 경제에 큰 영향을 미칩니다.',
'미국에서 가장 부유한 사람들은 미국의富裕계에 속하는 인물들입니다. 현재 미국의 가장 부유한 사람들은 다음과 같습니다.\n\n1. **Bill Gates** : Microsoft의 창립자이자 CEO로, 약 220억 달러의 자산을 보유하고 있습니다.\n2. **Warren Buffett** : Berkshire Hathaway의 CEO로, 약 150억 달러의 자산을 보유하고 있습니다.\n3. **Jeff Bezos** : Amazon의 창립자이자 CEO로, 약 120억 달러의 자산을 보유하고 있습니다.\n4. **Mark Zuckerberg** : Facebook의 창립자이자 CEO로, 약 80억 달러의 자산을 보유하고 있습니다.\n5. **Elon Musk** : Tesla와 SpaceX의 CEO로, 약 70억 달러의 자산을 보유하고 있습니다.\n\n이 목록은 미국의 가장 부유한 사람들의 순위를 나타내는 것으로, 현재의 순위를 유지하는 것은 어렵습니다.']
Output parser
Outputparser은 나중에 자세하게 다뤄보기로하고 오늘은 차이점만 출력해 보았다.
chain = prompt_template | llama | StrOutputParser()
chain.invoke(input={"country": "대한민국"})
>> '대한민국의 가장 부자는 정의가 명확하지 않습니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람들은 다음과 같습니다.\n\n1. **Lee Jae-yong**: 한국의 LG 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 10위에 올랐습니다.\n2. **Koo Cha-bong**: 한국의 SK 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 20위에 올랐습니다.\n3. **Lee Kun-hee**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 30위에 올랐습니다.\n4. **Choi Tak**: 한국의 Samsung Electronics 사장으로, 2022년 Forbes 세계의 가장 부유한 사람 40위에 올랐습니다.\n5. **Lee Jae-hoon**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 50위에 올랐습니다.\n\n이러한 사람들은 한국의 산업계에서 중요한 역할을 하고 있으며, 한국의 경제를 지배하는 주요 그룹 중 하나입니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람은 정의가 명확하지 않으며, 다양한 출처에서 다른 사람들을 포함하여 달라질 수 있습니다.\n\n2022년 Forbes 세계의 가장 부유한 사람 100위에 올랐던 한국의 richest인들은 다음과 같습니다.\n\n1. Lee Jae-yong (LG 그룹)\n2. Koo Cha-bong (SK 그룹)\n3. Lee Kun-hee (Hyundai Motor Group)\n4. Choi Tak (Samsung Electronics)\n5. Lee Jae-hoon (Hyundai Motor Group)\n\n이 목록은 2022년 Forbes 세계의 가장 부유한 사람 100위에 올랐던 한국의 richest인들을 포함합니다.'
chain = prompt_template | llama
chain.invoke(input={"country": "대한민국"})
>> AIMessage(content='대한민국의 가장 부자는 정의가 명확하지 않습니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람들은 다음과 같습니다.\n\n1. **Lee Jae-yong**: 한국의 LG 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 10위에 올랐습니다.\n2. **Koo Cha-bong**: 한국의 SK 그룹 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 20위에 올랐습니다.\n3. **Lee Kun-hee**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 30위에 올랐습니다.\n4. **Choi Tak**: 한국의 Samsung Electronics 사장으로, 2022년 Forbes 세계의 가장 부유한 사람 40위에 올랐습니다.\n5. **Lee Jae-hoon**: 한국의 Hyundai Motor Group 회장으로, 2022년 Forbes 세계의 가장 부유한 사람 50위에 올랐습니다.\n\n이러한 사람들은 한국의 산업계에서 중요한 역할을 하고 있으며, 한국의 경제를 지배하는 주요 그룹 중 하나입니다. 그러나 한국의 richest인들 중에서 가장 부유한 사람은 정의가 명확하지 않으며, 다양한 출처에서 다른 사람들을 포함하여 달라질 수 있습니다.\n\n2022년 Forbes 세계의 가장 부유한 사람 100위에 올랐던 한국의 richest인들은 다음과 같습니다.\n\n1. Lee Jae-yong (LG 그룹)\n2. Koo Cha-bong (SK 그룹)\n3. Lee Kun-hee (Hyundai Motor Group)\n4. Choi Tak (Samsung Electronics)\n5. Lee Jae-hoon (Hyundai Motor Group)\n\n이 목록은 2022년 Forbes 세계의 가장 부유한 사람 100위에 올랐던 한국의 richest인들을 포함합니다.', additional_kwargs={}, response_metadata={'model': 'llama3.2:latest', 'created_at': '2024-12-23T02:08:38.994162573Z', 'done': True, 'done_reason': 'stop', 'total_duration': 3366183629, 'load_duration': 26899119, 'prompt_eval_count': 34, 'prompt_eval_duration': 23000000, 'eval_count': 403, 'eval_duration': 3314000000, 'message': Message(role='assistant', content='', images=None, tool_calls=None)}, id='run-a385ae13-c1c5-47f9-b675-0658e47114dd-0', usage_metadata={'input_tokens': 34, 'output_tokens': 403, 'total_tokens': 437})
아래부터는 async / await을 이용한 동기 / 비동기 관련한 사용법들인데, 프로젝트에서 대리님이 쓰시는 걸 봤었는데 아직 잘 몰라서 먼저 동기/비동기 개념을 알고 진행하였다.
(동기/비동기 링크)
async stream: 비동기 스트림
async for token in chain.astream({"topic": "YouTube"}):
print(token, end="", flush=True)
async invoke: 비동기 호출
my_process = chain.ainvoke({"city": "seoul"})
await my_process
async batch: 비동기 배치
my_abatch_process = chain.abatch(
[{"city": "seoul"}, {"city": "busan"}, {"city": "yongin"}]
)
await my_abatch_process
Parallel
RunnableParallel 클래스를 이용하여 두 가지 작업을 병렬로 수행가능
from langchain_core.runnables import RunnableParallel
chain1 = (
PromptTemplate.from_template("{singer}의 대표곡은 뭐야?")
| llama
| StrOutputParser()
)
chain2 = (
PromptTemplate.from_template("{singer}의 최신곡은 뭐야?")
| llama
| StrOutputParser()
)
combined = RunnableParallel(capital=chain1, area=chain2)
combined.invoke({"singer": "bruno mars"})
>> {'capital': '브루노 마르스 (Bruno Mars)가 대표곡으로 알려진 곡은 "Just the Way You Are" (2010년), "Grenade" (2010년), "Locked Out of Heaven" (2012년), "When I Was Your Man" (2012년), "Uptown Funk" (2014년) 등이 있습니다.',
'area': '안녕하세요! 브루노 마르스 (Bruno Mars)가 recently released 한 곡을 알려드릴게요.\n\n브루노 마르스의 latest single은 "Leave the Door Open"입니다. 이 곡은 2021년 2월에 발매되었으며, 그의 latest album "24K Magic"의 일부로도 bekannt합니다.\n\n"Leave the Door Open"는 브루노 마르스와 his band The Hooligans가 작곡하고 녹음한 곡으로, 이 곡은 R&B 및 팝 음악 장르를 특징으로합니다. 이 곡은 브루노 마르스의 vocally와 instrumentation에 의해 강조되는 감성적인 보컬과 멋진 instrumentation이 특징입니다.\n\n이 곡은 브루노 마르스와 his band의 latest album "24K Magic"에서 1st single로 발매되었으며,
이 곡은 많은 음악 비평가들로부터 긍정적인 평가를 받았습니다.'}
마찬가지로 batch도 병렬로 수행가능
answer = combined.batch([{"singer": "bruno mars"}, {"singer": "ariana grande"}])
print(answer)
>> [{'capital': '브루노 마르스 (Bruno Mars)가 대표곡으로 알려진 곡은 "Just the Way You Are" (2010년), "Grenade" (2010년), "Locked Out of Heaven" (2012년), "When I Was Your Man" (2012년), "Uptown Funk" (2014년) 등이 있습니다.',
'area': '안녕하세요! 브루노 마르스 (Bruno Mars)가 recently released 한 곡을 알려드릴게요.\n\n브루노 마르스의 latest single은 "Leave the Door Open"입니다. 이 곡은 2021년 2월에 발매되었으며, 그의 latest album "24K Magic"의 일부로도 bekannt합니다.\n\n"Leave the Door Open"는 브루노 마르스와 his band The Hooligans가 작곡하고 녹음한 곡으로, 이 곡은 R&B 및 팝 음악 장르를 특징으로합니다. 이 곡은 브루노 마르스의 vocally와 instrumentation에 의해 강조되는 감성적인 보컬과 멋진 instrumentation이 특징입니다.\n\n이 곡은 브루노 마르스와 his band의 latest album "24K Magic"에서 1st single로 발매되었으며, 이 곡은 많은 음악 비평가들로부터 긍정적인 평가를 받았습니다.'},
{'capital': '아리나 그란데(Ariana Grande)의 대표곡으로는 "Thank U, Next", "7 Rings", "Break Free" 등이 있습니다. 하지만 가장 유명한 대표곡 중 하나는 "Thank U, Next"입니다.\n\n"Thank U, Next"는 2018년 1월에 발매된 그녀의 세 번째 스튜디오 앨범 \'thank u, next\'의 타이틀 곡으로, 이 곡은 아리나 그란데가 자신의 인생에서 겪었던 다양한 경험과 lessons를 통해 자신을 thank할 수 있는 사람들에 대해 노래합니다. 이 곡은 상당히 성공적이었고, 미국 Billboard Hot 100 차트에서 1위를 차지했습니다.\n\n이 곡은 또한 아리나 그란데의 음악 스타일과 인물로 알려진 "가수"와 "시인"의 두면性的 표현을 보여주었습니다.',
'area': 'ariana 그랜드의 최신 곡을 찾는 것은 쉽지 않습니다. 아리아나 그랜드는 다양한 장르와 스타일로 음악을 제작하고 있습니다. 최근에 발표된 그녀의 노래 중 일부를 below에 liệt어두겠습니다.\n\n* "POV" (2020년 8월)\n* "Positions" (2020년 10월)\n* "Motive" (2021년 2월)\n* "Shut Up" (2021년 6월)\n* "Boyfriend" (2021년 9월)\n\nariana 그랜드의 최신 곡을 찾고 싶다면, 그녀의 공식 웹사이트나 스타그램을 확인하거나, 음악 플랫폼인 Spotify나 Apple Music에서她的 노래를 검색할 수 있습니다.'}]
저작자: 테디노트 / <랭체인 LangChain 노트> - LangChain 한국어 튜토리얼 / (CC BY-NC-ND 2.0 KR)
728x90
반응형
'ML & DL > NLP' 카테고리의 다른 글
한 권으로 끝내는 랭체인 노트 따라하기 Day 4 - FewShotPrompt (0) | 2024.12.23 |
---|---|
한 권으로 끝내는 랭체인 노트 따라하기 Day 3 - prompt (0) | 2024.12.23 |
한 권으로 끝내는 랭체인 노트 따라하기 Day 1 (0) | 2024.12.23 |
한 권으로 끝내는 랭체인 노트 따라하기 Day 0 (0) | 2024.12.20 |
[패캠/NLP] BERT (0) | 2023.12.28 |