카테고리 없음

스파르타 AI-8기 TIL(11/20) -> 처음부터 계속하기

kimjunki-8 2024. 11. 20. 22:31
LangChain
LangChain은 대규모 언어 모델(LLM)을 활용하여 자연어 처리 작업을 쉽게 수행할 수 있도록 돕는 프레임워크입니다. LangChain은 LLM의 입력과 출력을 관리하고, 이를 기존 데이터 또는 사용자 정의 논리에 통합할 수 있는 다양한 모듈을 제공합니다.
주요 기능:
LLM을 이용한 텍스트 생성 및 요약

데이터베이스나 외부 파일에서 정보 검색 (Retrieval-Augmented Generation, RAG)

워크플로우 정의 (Chains & Agents)

메모리 및 상태 관리

하나의 체인
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from openai import OpenAI
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template('Explain {word} in Korean')
llm = ChatOpenAI(model = 'gpt-4o')
parser = StrOutputParser()
chain = prompt|llm|parser
chain.invoke({"word":"사과"})

먼저,
ChatPromptTemplate.from_template("")에서 어떤 작업을 할 지 여기서 정해주는 역할을 합니다.
모델은 ChatOpenAI에 있는 모델을 들고 왔으며,
여기서 parser란 존재가 나옵니다.

LangChain에서 Parser는 보조 도구로 사용됩니다.
파서(parser)는 입력 데이터(일반적으로 소스 코드)를 구조화된 형식으로 변환하는 프로그램입니다. 파이썬에서의 parsing의 목적은 코드를 기계가 읽을 수 있는 형식으로 변환하여 추가 처리 및 분석을 용이하게 하는 것입니다.
StrOutputParser()은 받은 값을 Str로 즉, 텍스트 형식으로 바꿔서줍니다.

그리고 여기서 | 이란 녀석이 나왔습니다. 이것이 바로 LangChain의 핵심이자, LangChain이 뭔지 알려줍니다.
이 녀석은 |로 묶여진 다른 값들을 처음부터 하나하나 체인처럼 하나씩 실행시키는 녀석입니다.

그리고 .invoke
.invoke()는 invoke는 랭체인뿐만아니라 llm분야에서 보통 어떤 반응을 유발시킬때 널리쓰이는 함수이며, 랭체인에서 runnable객체 혹은 runnable객체 래핑할때 , input 주고 output 내보낼때 invoke함수를 사용하도록 정해져있습니다. 참고로 runnable은 |과 관련 있습니다.

참고로 하나의 체인이 아니라, 여러 체인을 가질 수 있습니다.

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt1 = ChatPromptTemplate.from_template('translate {sentence} to English')
prompt2 = ChatPromptTemplate.from_template('Explain the topic in {sentence2}')
llm = ChatOpenAI(model = 'gpt-4o')
output_parser = StrOutputParser()
chain1 = prompt1 | llm | output_parser#StrOutputParser()는 답으로 나온 것을 str으로 변환해서 준다
#여기서 {sentence}와 연결되어 있는 부분을 llm을 통해 값을 얻고 그 값을 StrOutputParser()가 답을 준다
chain2 = {"sentence2": chain1} | prompt2 | llm | output_parser
#RunnableThrough

#파서(parser)는 입력 데이터(일반적으로 소스 코드)를 구조화된 형식으로 변환하는 프로그램입니다. 
#파이썬에서의 parsing의 목적은 코드를 기계가 읽을 수 있는 형식으로 변환하여 
#추가 처리 및 분석을 용이하게 하는 것입니다.
chain2.invoke({"sentence" : '사람이란 무엇인가?'})
print("""

먼저, 체인이 2개 연결되어 있는 상황입니다
사람인란 무엇인가?에서 사람이란 무엇인가라는 것은 첫번 째 prompt1이자 template인 sentence에 맞게 들어가게 됩니다. 
그런데 돌린것은 chain2입니다(chain2.invoke). prompt1은 chain1에 쓰이는데,
먼저 넣어준 것은 sentence입니다. 그러면 'translate {sentence} to English'라는 프롬프트에 맞게 영어로 해석이 됨과 동시에, 그 해석된 값이 chian1으로 들어가게 됩니다. 
그런데 chain2를 실행되어야 하는데 왜 chain1이 실행이 되냐면, chain2에서 chain1의 값을 가져오기 때문입니다.{"sentence2": chain1}.
그렇게 chain1을 가져오기 때문에, chain1은 실행이 되고, 그 값을 가져와서 chain2에 들어가 차례차례 체인으로 계산되어 최종적으로 값이 나옵니다.

그런데 '에이 그러면 |만 쓰면 Langchain아니야?'라고 하실 수 있는데, 틀렸습니다.
먼저, |와 Lagnchain에서 RunnablepassThrough라는 개념이 있습니다.
먼저 |은 Runnable한 객체 + 조건을 만족하는 python함수도 포함해야 쓸 수 있습니다.

LangChain에서 `|` 연산자를 사용하려면 반드시 해당 함수나 객체가 입력과 출력의 흐름을 처리할 수 있어야 합니다.
`Runnable` 인터페이스와의 호환성
LangChain의 체인 동작은 기본적으로 Runnable 인터페이스를 따릅니다. 다음 중 하나에 해당하면 `|` 연산자에 사용할 수 있습니다:
1. Runnable 객체
이미 `Runnable` 인터페이스를 구현하고 있는 객체는 바로 사용 가능합니다.
예: `LLMChain`, `PromptTemplate`, `Retriever` 등.

2. 일반 python 함수
함수가 입력을 받고 출력을 반환하는 형태라면, LangChain이 이를 RunnableFunction으로 자동 래핑하여 사용합니다.
함수의 인자는 체인의 출력 형태와 일치해야 하고, 반환값은 다음 체인이 처리 가능한 형식이어야 합니다.

`|` 연산자 안에 아무 함수나 넣을 수 있는 것은 아닙니다. 조건을 만족하지 못하는 경우 에러가 발생합니다.

def invalid_function(x, y):
    return x + y  # 인자가 두 개이므로 이전 체인의 단일 출력과 호환되지 않음

retriever | invalid_function  # 에러 발생

위 함수는 입력을 두 개(`x`와 `y`) 받아야 하지만, 
체인은 일반적으로 하나의 인자만 전달하므로 호환되지 않습니다


def double_length(text):
    return len(text) * 2

# 이전 단계의 출력이 단일 문자열이라면 동작
retrieval_chain = retriever | double_length

위 함수는 데이터 타입도 맞추고, 입력의 갯수도 맞추었으므로 호환 가능합니다.


위 함수는 데이터 타입도 맞추고, 입력의 갯수도 맞추었으므로 호환 가능합니다.

결론
`|` 안에 들어갈 수 있는 함수는 다음 조건을 만족해야 합니다:
1. 입력을 받고 출력을 반환하는 형태의 함수 (당연히 이전 체인의 출력과 데이터 타입이 호환되어야 함)
2. Runnable이 아니더라도 LangChain이 자동으로 RunnableFunction으로 변환할 수 있어야 함.즉, 함수의 형식과 데이터 흐름만 맞춘다면 거의 모든 함수를 `|`에 사용할 수 있습니다.


기본 LLM 체인
기본 LLM 체인 (Prompt + LLM) - 기본 LLM 체인(Prompt + LLM)은 LLM 기반 애플리케이션 개발에서 핵심적인 개념 중 하나입니다. 이러한 체인은 사용자의 입력(프롬프트)을 받아 LLM을 통해 적절한 응답이나 결과를 생성하는 구조를 말합니다. 이 과정은 대화형 AI, 자동 문서 생성, 데이터 분석 및 요약 등 다양한 용도로 활용될 수 있습니다.

 

오늘은 다른 일을 많이해서 TIL을 많이는 못 적었네요......내일 많이 적어야지.....