2024-12-16
※ 제수기 시리즈는 '제발수업을기억하자'의 의미를 담고 있으며, 틀린 정보가 담길 수 있습니다.
- LangChain/LangSmith 환경설정
- Model I/O
- Retrieval
- Chains
- Memory
- Agent/Tool
LangChain은 다양한 언어 모델(LLM, Large Language Models)을 연결하고
확장할 수 있도록 도와주는 Python 및 JavaScript 프레임워크이다.
단순히 텍스트 생성을 넘어, LLM이 외부 데이터와 상호작용하거나 복잡한 작업을
수행할 수 있도록 체인, 에이전트, 메모리 등의 기능을 제공했다.
주요 기능
!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")
messages = [
SystemMessage(content="Translate the following text to Korean."),
HumanMessage(content="Good morning, Today is monday.")
]
response = model.invoke(messages)
invoke( ) 메서드: LangChain에서 OpenAI API를 호출하여 GPT 모델로부터 응답을 가져온다. messages 리스트를 입력으로 사용해서 정의된 프롬프트를 전달.
print(response.content)
🥐https://python.langchain.com/docs/concepts/
여기에 자세히 있으므로 여러번 읽어보기
https://python.langchain.com/api_reference/core/prompts.html#langchain-core-prompts
1. 자동화된 입력 구성
PromptTemplate 클래스
template = "{product}를 홍보하기 위한 재미있고, 새로운 광고 문구를 작성해주세요."
prompt = PromptTemplate(
template=template,
input_variables=['product']
)
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)
parsed_response = output_parser.parse(response.content)
print(parsed_response)
print(type(parsed_response))
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 # 생성할 최대 토큰 수
)
model = ChatHuggingFace(
llm=endpoint
verbose=True
)
ModelLaboratory는 LangChain에서 제공하는 유틸리티로, 여러 LLM 모델을 비교하고 평가할 수 있도록 설계됐다.
model_lab = ModelLaboratory.from_llms([model1, model2])
model_lab.compare('대한민국의 가을은 몇월부터 몇월인가요?')
from_llms: 비교할 모델 리스트를 입력받아 ModelLaboratory 객체를 생성
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
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]}")
인덱스 생성(Indexing)
데이터베이스 내의 모든 문서를 벡터화하거나 인덱스를 생성하여 검색 가능 상태로 만듦.
Sparse Retriever는 일반적으로 역색인(Inverted Index)을 사용.
Dense Retriever는 문서와 질의를 같은 벡터 공간에 맵핑하여 유사성을 계산.
질의 처리(Query Processing)
사용자의 질의를 전처리하거나 벡터화.
Dense Retriever에서는 질의를 모델에 입력해 벡터 표현으로 변환.
유사도 계산(Similarity Calculation)
질의와 문서 간의 유사도를 계산.
Sparse Retriever: TF-IDF, BM25 등의 통계적 방법 사용.
Dense Retriever: 벡터 간의 코사인 유사도 또는 내적 계산.
결과 반환
유사도 점수에 따라 문서를 정렬하여 반환.
... 더 많이 배웠지만 나중에 이어서 정리하는 걸로..