한 권으로 끝내는 랭체인 노트 따라하기 Day 2 - LCEL

2024. 12. 23. 12:54·ML & DL/NLP

오늘의 실습

 

05. LangChain Expression Language(LCEL)

.custom { background-color: #008d8d; color: white; padding: 0.25em 0.5…

wikidocs.net

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를 거치고, 모델을 거친다라는 단순한 것 같다. 기호는 `|`를 이용해서 연결해 주면 된다. 

<랭체인 LangChain 노트> - LangChain 한국어 튜토리얼(https://wikidocs.net/233344)

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
'ML & DL/NLP' 카테고리의 다른 글
  • 한 권으로 끝내는 랭체인 노트 따라하기 Day 4 - FewShotPrompt
  • 한 권으로 끝내는 랭체인 노트 따라하기 Day 3 - prompt
  • 한 권으로 끝내는 랭체인 노트 따라하기 Day 1
  • 한 권으로 끝내는 랭체인 노트 따라하기 Day 0
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (481)
      • 알쓸신잡 (88)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Blog

    • 🏠 Home

    ✏️글쓰기
    💻 관리

    Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    DFS
    백준
    그리디
    BFS
    dp
    나동빈
    이것이취업을위한코딩테스트다
    이분탐색
    파이썬
    이코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바