제수기 > Langchain

Eunbi Jo·2024년 12월 17일
0

제수기

목록 보기
5/90

2024-12-16

※ 제수기 시리즈는 '제발수업을기억하자'의 의미를 담고 있으며, 틀린 정보가 담길 수 있습니다.

수업 목차

- LangChain/LangSmith 환경설정 
- Model I/O 
- Retrieval 
- Chains
- Memory
- Agent/Tool

Langchain Overview

https://www.langchain.com/

LangChain은 다양한 언어 모델(LLM, Large Language Models)을 연결하고 
확장할 수 있도록 도와주는 Python 및 JavaScript 프레임워크이다. 
단순히 텍스트 생성을 넘어, LLM이 외부 데이터와 상호작용하거나 복잡한 작업을 
수행할 수 있도록 체인, 에이전트, 메모리 등의 기능을 제공했다.

주요 기능

  • LLM 통합: OpenAI, Hugging Face Transformers, Cohere 등 다양한 LLM과 연계 가능.
  • 체인(chain) 관리: 여러 작업(예: 질의 응답, 텍스트 생성)을 순차적으로 연결하여 실행.
  • Prompt 관리: 프롬프트 템플릿 생성 및 관리.
  • Agent 사용: LLM이 특정 작업을 수행할 수 있도록 외부 도구(예: 계산기, 데이터베이스)와 통합.
  • Memory:대화형 애플리케이션에서 LLM이 상태(대화 히스토리 등)를 유지할 수 있도록 지원.

Langchain_Langsmith_setup

!pip install langchain
from dotenv import load_dotenv, find_dotenv
print(find_dotenv())
load_dotenv()

.env 파일은 간단한 텍스트 형식이며, 키=값 구조로 데이터를 저장한다. 민감 정보 보관에 쓰인다. 키, 데이터베이스 비밀번호, 인증정보 등을 코드에 하드코딩하지 않고 .env파일에 저장한다.

import os
os.getenv("LANGCHAIN_PROJECT")

.env 파일에 있는 LANGCHAIN_PROJECT 라는 변수의 값을 가져오라는 뜻이다.
LLM 모델 정의

model = ChatOpenAI(model="gpt-4o")
  • ChatOpenAI는 LangChain에서 OpenAI의 챗 기반 모델(예: GPT-4)을 쉽게 사용할 수 있도록 도와주는 클래스
  • model="gpt-4o"는 GPT-4의 옵션형 모델을 사용하겠다는 의미
    프롬프트 구성
messages = [
    SystemMessage(content="Translate the following text to Korean."),
    HumanMessage(content="Good morning, Today is monday.")
]
  • SystemMessage: 모델의 작업 지침을 정의
  • HumanMessage: 사용자 입력
response = model.invoke(messages)

invoke( ) 메서드: LangChain에서 OpenAI API를 호출하여 GPT 모델로부터 응답을 가져온다. messages 리스트를 입력으로 사용해서 정의된 프롬프트를 전달.

print(response.content)
  • GPT 모델이 반환한 텍스트 응답을 출력

Langchain components

🥐https://python.langchain.com/docs/concepts/
여기에 자세히 있으므로 여러번 읽어보기

model io

Prompts

https://python.langchain.com/api_reference/core/prompts.html#langchain-core-prompts
1. 자동화된 입력 구성

  • PromptTemplate을 사용하여 사용자 입력을 자동으로 구성.
  • 동일한 형식의 질문이나 대화를 대량으로 생성 가능.
  1. 대화형 응답
  • ChatPromptTemplate을 통해 대화형 AI의 문맥 유지를 지원.
  1. 샘플 기반 학습
  • Few-shot Prompt는 LLM에 구체적인 예제를 제공해 정확한 응답을 유도.
  1. 결과 파싱
  • Output Parsers를 통해 LLM의 출력을 특정 포맷으로 처리하여 후속 작업을 자동화.

PromptTemplate 클래스

template = "{product}를 홍보하기 위한 재미있고, 새로운 광고 문구를 작성해주세요."

prompt = PromptTemplate(
    template=template,
    input_variables=['product']
)
  • template: 광고 문구를 작성하는 데 사용할 템플릿
  • input_variables: 템플릿에 들어갈 변수명
  • prompt.format(): 템플릿의 {product} 부분을 format() 메서드에 전달된 값으로 치환

OutputParser

https://python.langchain.com/api_reference/langchain/output_parsers.html#module-langchain.output_parsers
LLM이 생성한 텍스트 출력을 특정 형식으로 변환하거나 처리하는 데 사용된다. 이는 모델의 응답을 해석하고, 이를 구조화된 데이터로 바꿔 후속 작업에 활용하기 위해 설계되었다.
1. BaseOutputParser: Output Parsers의 기본 클래스, 커스텀 파서 구현 시 사용.
2. CommaSeparatedListOutputParser: 콤마로 구분된 문자열을 리스트로 변환.
3. RegexParser: 정규식을 사용해 특정 패턴을 추출하고 키-값 형태로 반환.
4. StructuredOutputParser: 출력의 JSON 또는 구조화된 형식을 강제.
5. PydanticOutputParser: Pydantic 모델을 기반으로 출력 검증 및 변환.
6. MarkdownOutputParser: 마크다운 형식의 텍스트에서 데이터를 추출.

from langchain.output_parsers import CommaSeparatedListOutputParser

output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
  • CommaSeparatedListOutputParser: GPT 모델이 반환한 문자열 응답을 파싱하여 Python 리스트 형태로 변환하고 쉼표로 구분된 형식의 데이터를 생성하도록 지시
  • get_format_instructions(): GPT가 출력해야 할 데이터 형식을 설명하는 문자열을 반환
parsed_response = output_parser.parse(response.content)
print(parsed_response)
print(type(parsed_response))
  • output_parser.parse(): CommaSeparatedListOutputParser를 통해 문자열 데이터를 쉼표로 구분된 리스트로 변환.

HuggingFaceEndpoint

  1. llm: Hugging Face의 엔드포인트 연결
    llm은 LangChain의 언어 모델(LLM) 을 정의하는 중요한 요소.
endpoint = HuggingFaceEndpoint(
    repo_id='모델이름( 예시 : Bllossom/llama-3.2-Korean-Bllossom-3B)',  # 사용할 모델의 Hugging Face 저장소 ID
    task='text-generation',  # 작업 유형 (예: text-generation, text-classification 등)
    max_new_tokens=100  # 생성할 최대 토큰 수
)
  • task:
    text-generation: 텍스트 생성.
    text-classification: 텍스트 분류.
    token-classification: 토큰 단위 작업(예: 개체명 인식).
    summarization: 텍스트 요약.
    translation: 언어 번역.
model = ChatHuggingFace(
    llm=endpoint
    verbose=True
)
  • ChatHuggingFace: Hugging Face 모델의 엔드포인트를 LangChain에서 호출할 수 있도록 연결
  • llm=endpoint를 통해 Hugging Face 엔드포인트 객체를 지정
  • verbose=True는 LangChain 실행 중 내부 작업 상태와 디버깅 정보를 출력

ModelLaboratory

ModelLaboratory는 LangChain에서 제공하는 유틸리티로, 여러 LLM 모델을 비교하고 평가할 수 있도록 설계됐다.

model_lab = ModelLaboratory.from_llms([model1, model2])
model_lab.compare('대한민국의 가을은 몇월부터 몇월인가요?')

from_llms: 비교할 모델 리스트를 입력받아 ModelLaboratory 객체를 생성

Retrieval

OpenAI Embeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
  • OpenAIEmbeddings: OpenAI의 텍스트 임베딩 모델을 사용하여 텍스트를 고차원 벡터로 변환
  • model="text-embedding-3-small": OpenAI의 임베딩 모델로 1,536차원 벡터를 생성
vector = embeddings.embed_query(text)
  • 입력 텍스트: "The quick brown fox jumps over the lazy dog."

  • embed_query(): 입력 텍스트를 임베딩 벡터로 변환. 결과는 1,536개의 숫자로 이루어진 리스트.

  • 활용 사례
    1. 텍스트 간 유사도 계산
    벡터 간 코사인 유사도를 계산하여 두 텍스트의 의미적 유사성을 측정할 수 있다:

from sklearn.metrics.pairwise import cosine_similarity

text1 = "The quick brown fox jumps over the lazy dog."
text2 = "A fast brown fox leaps over a sleepy dog."

vec1 = embeddings.embed_query(text1)
vec2 = embeddings.embed_query(text2)

similarity = cosine_similarity([vec1], [vec2])
print(f"Cosine Similarity: {similarity[0][0]}")

Retriever

인덱스 생성(Indexing)

데이터베이스 내의 모든 문서를 벡터화하거나 인덱스를 생성하여 검색 가능 상태로 만듦.
Sparse Retriever는 일반적으로 역색인(Inverted Index)을 사용.
Dense Retriever는 문서와 질의를 같은 벡터 공간에 맵핑하여 유사성을 계산.
질의 처리(Query Processing)

사용자의 질의를 전처리하거나 벡터화.
Dense Retriever에서는 질의를 모델에 입력해 벡터 표현으로 변환.
유사도 계산(Similarity Calculation)

질의와 문서 간의 유사도를 계산.
Sparse Retriever: TF-IDF, BM25 등의 통계적 방법 사용.
Dense Retriever: 벡터 간의 코사인 유사도 또는 내적 계산.
결과 반환

유사도 점수에 따라 문서를 정렬하여 반환.

... 더 많이 배웠지만 나중에 이어서 정리하는 걸로..

0개의 댓글