SK네트웍스 Family AI 캠프 1기 16주차 회고
SK Networks AI Camp
Weekly 회고 - 16주차
포스트를 읽기 전에..
이 포스트는 SK네트웍스 Family AI 캠프를 다니면서 느낀 개인적인 생각을 정리한 포스트입니다.
배운 내용이나 스킬셋에 대한 설명은 별도로 작성하지 않았기 때문에, 그에 대한 정보는 다른 포스트를 참고해주세요!
Liked
안녕하세요! SK네트웍스 Family AI 캠프 16주차 회고입니다.
첫번째로 말씀드릴 좋은 점은.. 사실 캠프와는 관련없는 얘기지만, 저의 예비군이 끝났다는 것입니다!
그리고 두번째로 좋은 점은 Github 프로필을 드디어 정리했다는 것입니다.
Github README와 저장소 README를 정리해둬야겠다는 생각은 항상 있었는데, 매번 귀찮아서 미루다가 이번 주에 조금 여유가 있어서 새 단장을 해보았습니다!
궁금하신 분들은 여기를 눌러서 구경하러 오세요
Learned
이번 주는 간단하게 Vector 데이터베이스인 MongoDB 사용법을 배웠고, OpenAI API와 Langchain, RAG 등을 사용하는 방법을 배웠습니다.
그리고 지난 주에 간략하게 말씀드렸던 소켓 통신이 90% 이상 가능해져서 계속 테스트 중입니다!
MongoDB
- MongoDB란 무엇일까?
MongoDB는 오픈 소스의 NoSQL 데이터베이스고, 문서 지향(Document-Oriented) 저장소라고 하네요.
RDBMS와 달리 MongoDB는 데이터를 테이블과 행이 아닌 JSON과 유사한 BSON(Binary JSON) 형식의 문서로 저장합니다.
이를 통해 복잡한 데이터를 더 유연하게 다룰 수 있고, 수평적 확장과 대규모 데이터를 처리하는 데 매우 효율적입니다.
- MongoDB의 CRUD
- 데이터 삽입
1
2
3
4
5
db.collection.insertOne({
name: "Alice",
age: 25,
hobbies: ["reading", "traveling"]
})
- 데이터 조회
1
db.collection.find({ name: "Alice" })
- 특정 조건으로 데이터 업데이트
1
2
3
4
db.collection.updateOne(
{ name: "Alice" },
{ $set: {age: 26} }
)
- 데이터 삭제
1
db.collection.deleteOne({ name: "Alice" })
- MongoDB의 장단점
- 장점
- 유연한 데이터 구조
- 수평적 확장성
- 고속 데이터 처리
- 풍부한 인덱싱 및 쿼리 옵션
- 단점
- 복잡한 트랜잭션 처리
- 대규모 데이터베이스 관리의 어려움
- 중복 데이터 발생
- 정 리
MongoDB는 비정형 데이터나 자주 변경되는 데이터를 저장하고 확장이 중요한 환경에서 매우 유용합니다!
Langchain
Langchain이란 무엇일까? Langchain은 LLM을 활용하여 애플리케이션을 구축하는 데 도움을 주는 파이썬 라이브러리입니다.
특히 연결된 언어 모델로 복잡한 작업을 처리하거나 다양한 데이터를 통합하고 관리할 수 있도록 한다고 합니다.
Langchain의 핵심 목표는 언어 모델을 다양한 데이터 소스 및 연산 모듈과 결합하여 더 강력하고 유용한 애플리케이션을 구축할 수 있도록 돕는 것이라고 합니다!Langchain의 메서드들
- LLMChain
가장 기본적인 구조로 LLM을 중심으로 동작하는 체인입니다.
모델의 입력과 출력을 처리하고 체인 내에서 여러 단계를 조정하는 역할을 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 프롬프트 템플릿 생성
prompt = PromptTemplate(input_variables=["product"], template="What are the benefits of {product}?")
# OpenAI LLM 인스턴스 생성
llm = OpenAI(temperature=0.7)
# LLMChain 생성
chain = LLMChain(llm=llm, prompt=prompt)
# 체인 실행
result = chain.run("smartphone")
print(result)
- PromptTemplate
특정 형식의 입력을 받아 모델이 처리할 수 있도록 템플릿을 설정하는 메서드입니다.
1
2
3
4
from langchain.prompts import PromptTemplate
template = "Translate the following text to Spanish: {text}"
prompt = PromptTemplate(input_variables=["text"], template=template)
- Memory
대화의 문맥을 기억하고 유지하기 위한 메모리 기능입니다.
이를 이용하면 대화형 애플리케이션에서 지속적으로 상태를 유지할 수 있을 것 같습니다!
1
2
3
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
- Agent Langchain에서는 에이전트가 중요한 역할을 합니다.
에이전트는 주어진 작업을 수행하기 위해 다양한 도구를 활용하며,
유연하게 LLM의 출력을 조정하고 조작할 수 있습니다.
1
2
3
4
5
from langchain.agents import load_tools, initialize_agent, AgentType
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("What's the square root of 16 plus the current weather in New York?")
- Langchain의 장단점
- 장점
- 다양한 데이터 소스와의 통합
- 체인과 에이전트 기반의 유연성
- 상태 유지 및 메모리 기능
- 모듈화와 확장성
- 단점
- 초기 설정의 복잡성
- 성능 및 비용 문제
- 제한된 문맥 길이
- 정 리
Langchain은 체인과 에이전트 기반 설계를 통해 유연하고 확장 가능한 시스템을 만들 수 있습니다. 그러나 초기 설정의 복잡성과 성능 및 비용 문제를 잘 고려하여 선택해야 합니다!
RAG
- RAG란 무엇일까?
RAG(Retrieval-Augmented Generation) 는 LLM이 외부 데이터를 검색하고 생성 작업에 활용하는 기술입니다.
기본적으로 LLM은 훈련된 데이터 내에서만 정보를 기반으로 텍스트를 생성하지만,
RAG는 검색(retrieval) 단계를 추가하여 실시간 정보나 데이터베이스, 문서, 웹에서 필요한 정보를 가져오고, 이를 기반으로 텍스트를 생성하는 방식입니다.
RAG는 특히 문서 요약, 질문 답변, 대화형 시스템에서 강력한 성능을 발휘한다고 합니다!
- Langchain을 사용하여 RAG 구축하기
- 필요한 패키지 설치
1
pip install langchain openai faiss-cpu
- 데이터베이스 구축 및 검색 구성
RAG는 검색 기능이 핵심이기 때문에, 검색할 데이터를 벡터화하여 인덱싱해야 합니다.
이를 위해 FAISS 라이브러리를 사용해 문서 벡터 인덱스를 생성할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
# 샘플 문서 준비
documents = [
"Langchain is a powerful tool for building LLM applications.",
"FAISS is a vector search library that can index and search large datasets efficiently.",
"OpenAI provides cutting-edge language models such as GPT-4."
]
# 문서 텍스트를 벡터로 변환하기 위해 OpenAI의 임베딩 사용
embedding = OpenAIEmbeddings()
# 문서를 적절한 길이로 분할
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)
docs = text_splitter.create_documents(documents)
# 벡터 인덱스 구축
vectorstore = FAISS.from_documents(docs, embedding)
- 검색 및 생성 체인 구성
검색된 문서를 활용하여 답변을 생성하려면 Langchain에서 제공하는 RetrievalQAChain
을 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain.llms import OpenAI
from langchain.chains import RetrievalQAChain
# OpenAI LLM 설정 (GPT-4 사용 가능)
llm = OpenAI(temperature=0.5)
# 검색 기반 QA 체인 생성
qa_chain = RetrievalQAChain.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())
# 질문에 대해 검색 및 생성
query = "What is Langchain?"
result = qa_chain.run(query)
print(result)
- 추가 옵션 및 커스터마이징
Langchain은 다양한 옵션을 통해 RAG의 성능을 최적화할 수 있습니다.
예를 들어, 검색에 사용할 문서 수를 조정하거나, 답변을 생성할 때의 프롬프트 템플릿을 커스터마이징할 수 있습니다.
1
2
3
4
5
6
7
8
9
qa_chain = RetrievalQAChain.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(),
return_source_documents=True # 검색된 문서도 반환 가능
)
result = qa_chain({"query": "Tell me about FAISS"})
print(result['result']) # 생성된 답변
print(result['source_documents']) # 검색된 문서들
Lacked
9월 둘째 주에 OPIc 시험을 신청해뒀는데, 미리 신청 못한 게 아쉽습니다.
사실 미리 신청했어도, 공부할 시간이 부족했겠지만 처음 보는거라서 경험이 없는 것이 다소 걱정됩니다. 한번에 원하는 점수를 얻을 수 있도록 노력하겠습니다!
Longed for
다음 주부터 LLM 모델 파인 튜닝을 배운다고 합니다!
개인적으로 가장 중요한 것들 중에 하나라도 생각해서 기대가 됩니다.
파인 튜닝을 직접 해본 경험이 거의 없어서 다음 주 강의는 펑소보다 몇 배는 더 집중해야될 것 같아요!
그리고 최종 프로젝트 주제 후보들이 나왔는데 어떤 걸 진행하는 게 좋을지 고민이 됩니다.
고를 수 있는지 없는지도 모르지만..
아무튼 어떤 주제를 선택하든 최선을 다하겠습니다.
이번 주는 여기까지~