대규모언어모델(LLM: Large Language Model)을 활용한 서비스가 엄청나게 많이 생성되고 있다. 랭체인(Langchain)은 파이썬으로 대규모 언어 모델을 이용하기 위한 가장 좋은 패키지이자 모듈이다. ‘나도 한 번쯤?’이라고 생각했다면 잘 왔다. 굉장히 교과서적인 참고자료를 발견했고 과정을 한글로 풀이해봤다. 어떻게 코드를 작성해야 하는지 같이 따라와 보자.
Ollama를 활용하여 원하는 데이터 학습시키기
1단계: 모델 선정
from langchain_community.chat_models
import ChatOllama
model_local = ChatOllama(model="mistral")
위와 같이, 먼저 사용하고자 하는 llm 모델을 선정한다.
2단계: Split data into chunks
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
urls = ['https://ollama.com/',
'https://ollama.com/blog/windows-preview',
'https://ollama.com/blog/openai-compatibility']
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=7500, chunk_overlap=100)
doc_splits = text_splitter.split_documents(docs_list)
WebBaseLoader를 통해서 urls 리스트 내의 링크 내용을 학습 시키도록 하고 있다. 5단계에서 이 링크를 토대로 답변을 할 예정이다.
5단계에서 답변하는 내용이 실제로 맞는지 확인해보려면 urls 리스트 내의 내용을 참고하면 된다.
Text splitter는 말 그대로 주어진 내용을 문장 및 단어 단위로 쪼개고, 쪼개진 단위들은 doc_splits 변수에 저장되어 3단계 과정에서 벡터화(vectorize) 된다. 머신러닝 알고리즘은 숫자형 피처(feature)를 데이터로 입력 받아 동작하기 때문에 "텍스트" 자체가 아닌 특정 의미를 가지는 숫자 즉, 벡터 값으로 변환되어야 하는데 이 과정이 벡터화 과정이다.
벡터화, 토큰화(tokenization) 관련한 내용은 추후 정리해보도록 하겠다.
3단계: 분할된 단어와 문장 벡터 임베딩
4단계: 컨텍스트(context) 부여 전 output
5단계: 컨텍스트(context) 부여 후 output
from langchain_core.runnables import RunnablePassthrough
print ("\\n########\\nAfter RAG\\n")
after_rag_template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
after_rag_prompt = ChatPromptTemplate.from_template(after_rag_template)
after_rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| after_rag_prompt
| model_local
| StrOutputParser()
)
print (after_rag_chain.invoke("What is Ollama?"))
Output:
과정 요약
import하는 클래스, 모듈은 보통 최상단에 모두 선언을 하지만, 각 선언 모듈이 어떤 기능을 담당하는지 명확하게 보고자 해당하는 코드 블럭에 포함시켰다. 아마 위의 과정으로 llm을 어떻게 활용할지 벌써 감이 온 사람도 있을 것이고 아닌 사람도 있을 것이다.
앞으로 조금 더 깊은 내용을 숙지하고자, 파악한 내용을 바탕으로 자주 사용되는 class, function들을 정리해보려 한다. 이해를 해야 코드를 좀 더 고도화 시킬 수 있기 때문에 llm에 관심 있는 사람들은 후에 발행될 포스트를 참고하면 좋을 듯하다.
앞으로 자세히 알아볼 내용
- RAG(Retrieval-Augmented Generation) 개념
- LLM 모델 종류
- 토큰화(tokenization), 벡터화(vectorization)
- 문서 열기(document load)
- 텍스트 분할(text split)
- 임베딩(embedding)
- 벡터 저장(vectorstore): 크로마, FAISS
- 프롬프트(prompt), prompt template
- 출력 파서(output parser)
출처
이 포스트는 다음의 youtube를 참고하여 작성했다. 공식 문서만을 가지고 따라가기 힘들었던 과정을 이 짧은 동영상으로 파악할 수 있었다. 너무 감사한 동영상이다. 한 번씩 보시길 추천한다.
Ollama Embedding: How to Feed Data to AI for Better Response?