LLM을 이용한 애플리케이션을 만들때, 가장 단순한 구조는 사용자의 입력을 받아 LLM이 질문에 대해 응답을 생성하고, 출력하는 Input - LLM - Output으로 이루어진 체인이다. 작업 요구 사항에 따라 여러 단계의 과정이 추가되어야하거나, 혹은 하나의 LLM에서 나온 응답을 다음 LLM이 받아서 처리하는 연속적인 처리 구조로 만들어야할 수 있다.
이러한 체이닝 구조의 워크플로우를 LangChain을 이용해 구현해보았다.
LangChain에서 실행가능한 모든 것들은 Runnable이다. 이 Runnable은 LCEL이라는 LangChain에서 사용하는 도메인 랭귀지를 이용해 선언적으로 사용할 수 있다. |
연산자를 이용해 이전단계의 출력을 다음단계로 보내는 식이다.
chain = (prompt | llm | StrOutputParser())
chain.invoke()
실습
특정 볼보 자동차 모델에 대한 영문 아티클을 요약을 잘하는 LLM에 전달해서 차 스펙에 대한 요약본을 만들게하고, 이를 한국어를 잘하는 LLM을 가지고 한국어로 번역하여 최종적으로 볼보 자동차에 대한 한국어 요약을 받으려고 한다.
구조는 다음과 같다.
LLM은 다음 두 모델을 사용했다.
사실 예시에서 Gemma2 하나만 쓰는게 결과는 마음에 들었지만, LLaMA3.2는 툴(tool)을 다룰 수 있기때문에 용도에 따라 2가지 이상의 LLM을 사용하는 상황은 충분히 있을 수 있을 것이다.
- LLaMA3.2: 한국어를 못함, 요약을 잘함
- Gemma2:2B: 한국어를 잘함
1. 모델 준비
pip install langchain-core langchain_ollama
from langchain_ollama.llms import OllamaLLM
llama_model = OllamaLLM(
model="llama3.2",
temperature=0.1,
)
gemma_model = OllamaLLM(
model="gemma2:2b",
temperature=0.1
)
2. 프롬프트 작성
prompt1
은 자동차에 관한 아티클을 읽고, 자동차의 스펙에 대해서 요약해 달라고 지시했다. 입력으로는 article
을 받는다.
prompt2
는 주어진 영문 텍스트를 한국어로 알기 쉽게 번역해달라고 요청을 한 것이다. 입력으로는 text
를 받는다.
from langchain_core.prompts import PromptTemplate
prompt1 = PromptTemplate.from_template(
"""
You are an assistant for summarizing technical articles.
First, Analyze the technical specifications of the car as described in the provided article.
Then write a summary of the key features of the car such as engine type, battery capacity, range, and safety features.
ARTICLE:
{article}
ANSWER:
"""
)
prompt2 = PromptTemplate.from_template(
"""
You are an helpful assistant for translating technical articles.
Translate the following text from English to Korean.
Avoid using complex words and keep the translation simple and easy to understand.
English:
{text}
Korean:
"""
)
3. 작업 정의
|
연산자를 이용해 간단히 체이닝 할 수 있다.
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
chain1 = (
{"article": RunnablePassthrough()}
| prompt1
| llama_model
)
chain2 = (
{"text": RunnablePassthrough()}
| prompt2
| gemma_model
)
chain = chain1 | chain2
4. 실행
from langchain_core.runnables import RunnableSequence
with open("download/car.txt", "r") as f:
article = f.read()
response = chain.stream(
article,
config={
"callbacks": [langfuse_handler]
)
for chunk in response:
print(chunk, end="", flush=True)
결과
LangFuse로 처리 과정을 확인해보았는데, GENERATION이 순차적으로 2번 찍히는 것이 보인다.
첫번째 지시사항에 download/car.txt
아티클이 잘 들어갔고, LLaMA3.2 LLM이 동작했음을 확인했다.
LLaMA3.2는 아티클을 다음과 같이 요약했다.
우리가 RunnablePassthrough()
를 이용했기 때문에, 이 출력은 그대로 다음 작업의 {text}
값으로 들어가게된다.
**Technical Specifications Analysis:**
1. **Engine Type:** Fully electric
2. **Battery Capacity:** 111kWh (initially available twin-motor all-wheel drive version)
3. **Range:** Up to 600 kilometers on a single charge, according to the WLTP test cycle
4. **Charging Time:** 30 minutes for 10-80% charging
5. **Safety Features:**
* Invisible shield of safety enabled by latest sensing technology (cameras, radars, lidar)
* State-of-the-art sensors and cameras gauge eye gaze concentration
* Alert system to detect distraction, drowsiness, or inattentiveness
* Ability to safely stop and call for help in case of emergency
6. **Technology:**
* NVIDIA DRIVE AI platforms Xavier and Orin
* Snapdragon Cockpit Platforms from Qualcomm Technologies
* In-house developed software by Volvo engineers
7. **Interior Features:**
* 14.5-inch centre screen with Google built-in
* Wireless Apple CarPlay compatibility
* Bowers & Wilkins audio system featuring Dolby Atmos
8. **Sustainability Features:**
* Fully electric technology base
* Bi-directional charging capability (planned for future release)
* High percentage of recycled materials (15% steel, 25% aluminium, 48kg of recycled plastics)
**Summary of Key Features:**
The Volvo EX90 is a fully electric vehicle that offers an impressive range of up to 600 kilometers on a single charge. Its advanced safety features include an invisible shield of safety enabled by latest sensing technology, as well as an alert system to detect distraction, drowsiness, or inattentiveness. The vehicle also boasts cutting-edge technology, including NVIDIA DRIVE AI platforms and Snapdragon Cockpit Platforms from Qualcomm Technologies.
The interior features a 14.5-inch centre screen with Google built-in, wireless Apple CarPlay compatibility, and a premium Bowers & Wilkins audio system featuring Dolby Atmos. The Volvo EX90 is designed to support a more sustainable lifestyle, with a fully electric technology base, bi-directional charging capability (planned for future release), and high percentages of recycled materials.
Overall, the Volvo EX90 offers an exceptional driving experience, advanced safety features, and innovative technology, making it an attractive option for those seeking a sustainable and connected driving experience.
Gemma가 이를 받아서 한국어로 한번 더 처리해서 출력된 모습이다.
## Volvo EX90 기술 특징 분석 (한국어 번역)
**1. 엔진 유형:** 완전 전기
**2. 배터리 용량:** 111kWh (초기 출시는 동력 전륜 구동 버전)
**3. 연비:** WLTP 테스트 순환에 따르면 한 주행에서 최대 600km까지
**4. 충전 시간:** 10-80% 충전은 30분
**5. 안전 기능:**
* 최신 감지 기술 (카메라, 레이더, LiDAR)을 활용한 무인 보호막
* 최첨단 센서와 카메라로 눈의 집중도를 판별
* 피드백 시스템으로 주행 중에 유사한 상황 발생 시 경고 및 도움 요청 가능
* 심각한 사고 발생 시 안전하게 정지하고 도움을 요청 가능
**6. 기술:**
* NVIDIA DRIVE AI 플랫폼 Xavier & Orin
* Qualcomm Technologies Snapdragon Cockpit 플랫폼
* Volvo 엔지니어 개발한 내부 소프트웨어
**7. 내구성 기능:**
* 14.5인치 중앙 화면 (Google 내장)
* Apple CarPlay 무선 연결 가능
* Dolby Atmos를 지원하는 Bowers & Wilkins 오디오 시스템
**8. 환경 보호 기능:**
* 완전 전기 기술 기반
* 두 방향 충전 기능 (미래 출시 예정)
* 15% 강철, 25% 알루미늄, 48kg 재활용 플라스틱 사용량
**핵심 기능 요약:**
Volvo EX90는 최대 600km의 연비를 제공하는 완전 전기 차량입니다. 안전 기능은 최신 감지 기술을 활용한 무인 보호막과 피드백 시스템으로 주행 중에 유사한 상황 발생 시 경고 및 도움 요청 가능합니다. 또한 NVIDIA DRIVE AI 플랫폼, Qualcomm Technologies Snapdragon Cockpit 플랫폼 등 최첨단 기술을 사용했습니다.
내부에는 14.5인치 중앙 화면 (Google 내장), 무선 Apple CarPlay 연결 가능, Dolby Atmos를 지원하는 Bowers & Wilkins 오디오 시스템 등이 있습니다. Volvo EX90는 환경 보호에 초점을 맞춘 차량으로 완전 전기 기술 기반, 두 방향 충전 기능 (미래 출시 예정) 및 재활용 플라스틱 사용량이 높습니다.
결론적으로 Volvo EX90은 뛰어난 운전 경험, 고급 안전 기능, 그리고 최첨단 기술을 제공하여 환경 보호와 연결된 차량으로서 인기 있는 선택입니다.
'프로그래밍 > AI,ML' 카테고리의 다른 글
[LangChain] LLM 워크플로우 : Routing 구현 (0) | 2025.01.14 |
---|---|
[LangChain] LLM Workflow : 병렬처리 구현 (0) | 2025.01.14 |
프롬프팅 팁 (0) | 2025.01.09 |
프롬프팅의 기법 (1) | 2025.01.09 |
Langchain으로 간단한 RAG 구현하기 (0) | 2025.01.08 |