[AI] Langchain 복습 - 1

늘 공부하는 괴짜·2025년 4월 4일
0

AI : Langchain (RAG)

목록 보기
11/38

지난 약 2주동안 그냥 계속 뭔가를 만들기만 했지 돌아보는 시간이 없었던거 같아서 며칠 동안은 배운 것을 끄적여 보는 시간을 가지려고 한다.

1. 기본 LLM 체인 (Prompt + LLM)

  • Prompt : 사용자 또는 시스템에서 제공되는 "입력" 으로 LLM에게 특정 작업을 수행하도록 요청하는 지시문.
  • LLM : 대규모 언어 모델

2. 일반적인 작동 방식

  1. 프롬프트 생성 : 사용자의 요구 사항이나 특정 작업을 정의하는 프롬프트를 생성
  2. LLM 처리 : 제공된 프롬프트를 분석하고, 학습된 지식을 바탕으로 적절한 응답을 생성
  3. 응답 반환 : LLM에 의해 생성된 응답은 최종 사용자에게 필요한 형태로 변환되어 제공

3. 작동 방식 예제

기존에 사용하던 ollama 를 사용했다.

from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv

# .env 파일에서 환경 변수를 로드
setLoadDotEnv()

# LLM
llm = ChatOllama(model="llama3.1:8b")

# LLM 실행
llm.invoke("하루는 몇시간이야?")

# 결과
content='하루 24시간이 있습니다.' additional_kwargs={} response_metadata={'model': 'llama3.1:8b', 'created_at': '2025-04-04T14:38:56.598274Z', 'done': True, 'done_reason': 'stop', 'total_duration': 4638442292, 'load_duration': 45476458, 'prompt_eval_count': 17, 'prompt_eval_duration': 3431177250, 'eval_count': 9, 'eval_duration': 1153758625, 'message': Message(role='assistant', content='', images=None, tool_calls=None)} id='run-ff9a7ab5-6e47-43e9-9933-a41800249b53-0' usage_metadata={'input_tokens': 17, 'output_tokens': 9, 'total_tokens': 26}

4. 프롬프트와 LLM 연결 (기본형)

from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv
from langchain_core.prompts import ChatPromptTemplate

# .env 파일에서 환경 변수를 로드
setLoadDotEnv()

# LLM 
llm = ChatOllama(model="llama3.1:8b")

# 프롬프트 템플릿 작성
# 사용자의 질문을 {input} 으로 전달받는다.
prompt = ChatPromptTemplate.from_template
("You are an expert in astronomy. Answer the question. <Question>: {input}")

# 프롬프트 객체 확인
# input_variables 가 input 이다. 프롬프트에서 지정한 변수명으로 받게 된다.
# input_variables=['input'] input_types={} partial_variables={} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], input_types={}, partial_variables={}, template='You are an expert in astronomy. Answer the question. <Question>: {input}'), additional_kwargs={})]


# 체인 생성 (프롬프트와 LLM 을 연결한다)
chain = prompt | llm

# 체인 실행
# 프롬프트에 필요한 question을 파라미터로 넘기면 llm 이 받아서 말해준다.
# 프롬프트에 당신은 천문학 전문가라고 지시한 상태.
result = chain.invoke({"input": "하루는 몇시간이야?"})

4-1. 결과

content='하루는 지구가 일주를 하면서 태양을 circumnavigate 한 때 간격입니다. 지구의 자전 주기가 24 시간이기 때문에, 하루는 24시간이라고 할 수 있습니다.\n\n하루에 여러 시간대가 있습니다: 오전(AM), 오후(PM)으로 나누고 12시로 나눕니다. 그리고 각 시간대는 세부분으로 나뉘어 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 시로 나눕니다.\n\n그리고 반올림 기법을 사용하여, 각 시간대는 15분 간격으로 나누어 1, 2, 3, ..., 59, 0분으로 나뉘어집니다.'..........

5. 프롬프트에 여러 변수 넣어보자.

from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv
from langchain_core.prompts import ChatPromptTemplate

# .env 파일에서 환경 변수를 로드
setLoadDotEnv()

# LLM 
llm = ChatOllama(model="llama3.1:8b")

# 프롬프트 템플릿 작성
# 사용자의 질문을 {expert}, {question} 으로 전달받는다.
prompt = ChatPromptTemplate.from_template
("You are an expert in {expert}. Answer the question. <Question>: {question}")

# 체인 생성 (프롬프트와 LLM 을 연결한다)
chain = prompt | llm

# 체인 실행
# expert 에 전문가 그룹, question 에 질문을 넣으면 전문가 그룹에 걸맞는 대답을 받을 수 있다.
result = chain.invoke({"expert": "survival", "question" : "계란에 대해 설명해줘."})

5-1. 프롬프트와 LLM 을 결합한 결과

content='계란! 그거는 살아남는 데 정말 중요한 재료 중 하나야.\n\n계란을 사용하는 방법은 여러 가지 있지만, 기본적으로는 다음과 같은 순서로 하자:\n\n1. 계란의 윗부분부터 깨트리기: 계란을 깨지 말고, 윗 부분부터 조금씩 깨트려서 열린다. 이게 중요해! 왜냐하면, 계란 속의 공기가 빠져나가야하는데, 그 전에 윗부분부터 깨어주면 쉽게 열린다.\n2. 계란의 흉부를 찾기: 계란을 깨트린 후, 계란의 중심을 향해 손바닥으로 만지면서 흉부(heart) 부분을 찾아라.'

여전히 개소리를 지껄이는 llama3.1:8b

6. 문자열을 파싱하여 보는 StrOutputParser()

OutputParser that paeses LLMResult into the top likely string
LLMResult를 가장 가능성이 높은 문자열로 분류 - OutputParser

from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# .env 파일에서 환경 변수를 로드
setLoadDotEnv()

# LLM 
llm = ChatOllama(model="llama3.1:8b")

# 프롬프트 템플릿 작성
prompt = ChatPromptTemplate.from_template("You are an expert in {expert}. Answer the question. <Question>: {question}")

# 문자열의 형태로 파싱
output_parser = StrOutputParser()

# 체인 생성 (프롬프트 > LLM > output_parser)
chain = prompt | llm | output_parser

# 체인 실행
result = chain.invoke({"expert": "survival", "question": "계란에 대해 설명해줘"})

print(result)

6-1. StrOutputParser() 를 적용한 결과

계란! 그것은 생존자에게 매우 중요한 음식 물질입니다.

계란은 단백질과 에너지가 풍부한 자연의 최고 재료 중 하나입니다. 그것은 쉽게 저장할 수 있고, 오랜 기간 동안 먹을 수 있기 때문에 생존자에게 매우 유용합니다.

 계란을 잘 처리하고 보관하는 방법에 대해서는 아래와 같이 설명할 수 있습니다:

1. **계란을 깨지 않도록 주의**하세요. 이것은 간단한 일입니다. 계란을 다루다가 깨지면, 그 속의 에그훅(흰자)과 아포크라틴이 오염되어 먹기 곤란해집니다.
2. **계란을 냉장 보관**하세요. 계란은 холодиль 속에 넣는 것이 좋습니다. 이것으로 계란의 수명이 연장되고, 더 오래 동안 안전하게 저장할 수 있습니다.
3. **계란을 익히기 전에 깨끗하게** 씻어주세요. 이로써 오염물질이 없도록 합니다.
4. **계란을 익힐 때는 조심**하세요. 계란을 너무 많이 가열하면 맛과 영양소가 손실될 수 있으므로 조리할 때 주의하십시오.

계란은 다양한 방법으로 먹을 수 있습니다. 예를 들어, 그것을 삶아서 기름에 구워 먹거나, 샌드위치에 넣거나, 오믈렛처럼 연속된 계란과 다른 재료를 혼합한 요리를 만들 수도 있습니다.

그리고 마지막으로, 계란은 생존자에게 특히 유용합니다. 그것은 매우 가볍고, 에너지를 많이 가지고 있으며, 오랜 기간 동안 먹을 수 있기 때문에 wilderness에서 살아남는 데 도움이 됩니다.

Finally

앞으로 한동안 복습과 응용을 같이 할거 같다. 자료를 계속 모으면서 정리해 보겠다.

끗!

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글