본문 바로가기

[LLM] Colab langchain 실습 본문

공부

[LLM] Colab langchain 실습

Savedata 2024. 5. 22. 17:24

langchain 예제를 colab에서 실습해보는 글

여러가지 예제 코드들 중 가장 간단해 보이는 코드를 진행.

여러가지 예제들 찾아서 해봤는데 버전 차이도 좀 있고 복잡할수록 문법 오류가 나는 것도 많아서 가장 간단한 것부터 수행해 봄.

https://wikidocs.net/book/14473

 

랭체인(LangChain) 입문부터 응용까지

**랭체인(LangChain) 입문부터 응용까지** 이책은 거대언어모델(LLM)을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 때 주로 활용되는 랭체인(LangCha…

wikidocs.net

위의 글을 그대로 따라해보며 간단한 코멘트를 작성해보는 정도.

 

목차

 

1. 환경 구성 및 기본 기능 수행

2. RAG

3. Vector Space

추천글

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

1. 환경 구성 및 기본 기능 수행

일단 구글에 올라와 있는 대부분의 예제들은 openai의 api key가 필요하고, 이를 위해서는 유료 결제와 예산을 넣어야 한다. 

https://teddylee777.github.io/openai/openai-api-key/

 

[2024년 UPDATE] OpenAI Python API 키 발급방법, 요금체계

[2024년 UPDATE] OpenAI Python API 키 발급방법 / 요금에 대해 알아보겠습니다.

teddylee777.github.io

이 블로그를 그대로 따라 해봤더니 잘 되더라.

간단한 기능들을 바로 실습해 볼 수 있어서 지루하지 않게 따라가 볼 수 있다.

API를 이용하여 LLM을 바로 사용해볼 수 있도록 환경을 구축해 놓았기에 굉장히 편리하게 이용이 가능하다.

랭체인에서 제공하는 각 기능들의 실습 코드들.

각각의 기능들이 어떤 역할을 하는지 익히고 지나가며 그 이후의 더 복잡한 기능들을 사용하기 위한 예제들.

2. RAG(Retrieval-Augmented Generation)

위의 기본 환경과 비슷하게 잘 세팅해주면 된다.

중간에 몇 가지 기능 예제들이 더 있지만 바로 필요한 부분으로 skip


구글에서 서칭한 보험 약관 PDF를 텍스트 데이터로 사용

CharacterTextSplitter 클래스로 주어진 텍스트를 문자 단위로 분할. 파이썬의 split 함수와 같음.

  • separator: 분할된 각 청크를 구분할 때 기준이 되는 문자열입니다. 여기서는 빈 문자열('')을 사용하므로, 각 글자를 기준으로 분할합니다.
  • chunk_size: 각 청크의 최대 길이입니다. 여기서는 500으로 설정되어 있으므로, 최대 500자까지의 텍스트가 하나의 청크에 포함됩니다.
  • chunk_overlap: 인접한 청크 사이에 중복으로 포함될 문자의 수입니다. 여기서는 100으로 설정되어 있으므로, 각 청크들은 연결 부분에서 100자가 중복됩니다.
  • length_function: 청크의 길이를 계산하는 함수입니다. 여기서는 len 함수가 사용되었으므로, 문자열의 길이를 기반으로 청크의 길이를 계산합니다.

RecursiveCharacterTextSplitter 클래스는 텍스트를 재귀적으로 분할하여 의미적으로 관련 있는 텍스트 조각들이 같이 있도록 하는 목적으로 설계.

 

대규모 언어 모델(LLM)을 사용할 때 모델이 처리할 수 있는 토큰 수에는 한계가 있기에 입력 데이터를 모델의 제한을 초과하지 않도록 적절히 분할하는 것이 중요. 이때 LLM 모델에 적용되는 토크나이저를 기준으로 텍스트를 토큰으로 분할하고, 이 토큰들의 수를 기준으로 텍스트를 청크로 나누면 모델 입력 토큰 수를 조절할 수 있음.

 

3. RAG Vector Space

RAG에서 찾아낸 보험료 정산에 관한 페이지

벡터 저장소(Vector Store)는 벡터 형태로 표현된 데이터, 즉 임베딩 벡터들을 효율적으로 저장하고 검색할 수 있는 시스템이나 데이터베이스를 의미합니다. 자연어 처리(NLP), 이미지 처리, 그리고 기타 다양한 머신러닝 응용 분야에서 생성된 고차원 벡터 데이터를 관리하기 위해 설계되었습니다. 벡터 저장소의 핵심 기능은 대규모 벡터 데이터셋에서 빠른 속도로 가장 유사한 항목을 찾아내는 것입니다.

벡터 저장
임베딩 벡터는 텍스트, 이미지, 소리 등 다양한 형태의 데이터를 벡터 공간에 매핑한 것으로, 데이터의 의미적, 시각적, 오디오적 특성을 수치적으로 표현합니다. 이러한 벡터를 효율적으로 저장하기 위해서는 고차원 벡터를 처리할 수 있도록 최적화된 데이터 저장 구조가 필요합니다.

벡터 검색
저장된 벡터들 중에서 사용자의 쿼리에 가장 유사한 벡터를 빠르게 찾아내는 과정입니다. 이를 위해 코사인 유사도, 유클리드 거리, 맨해튼 거리 등 다양한 유사도 측정 방법을 사용할 수 있습니다. 코사인 유사도는 방향성을 기반으로 유사도를 측정하기 때문에 텍스트 임베딩 검색에 특히 자주 사용됩니다.

결과 반환
사용자의 쿼리에 대해 계산된 유사도 점수를 기반으로 가장 유사한 항목들을 순서대로 사용자에게 반환합니다. 이 과정에서는 유사도 점수뿐만 아니라, 검색 결과의 관련성, 다양성, 신뢰도 등 다른 요소들을 고려할 수도 있습니다.
벡터 저장소는 Faiss(Facebook AI Similarity Search), Chroma, Elasticsearch, Pinecone 등 다양한 오픈 소스 및 상용 솔루션이 있으며, 각각의 특성과 성능이 다르기 때문에 사용 목적에 따라 적합한 도구를 선택해야 합니다.

 

Chroma 및 FAISS을 이용하여 사용자의 기법과 참고하는 문서에서 가장 유사한 정보를 찾아내고 이에 대한 답변을 하도록 만드는 기능들. 아래와 같은 순서를 통해 답변을 생성하게 된다.

Generation - 답변 생성

이번에는 실제로 사용자 쿼리('카카오뱅크의 환경목표와 세부추진내용을 알려줘')에 대한 답변을 생성해보겠습니다. 벡터 저장소에서 문서를 검색한 다음, 이를 기반으로 ChatGPT 모델에 쿼리를 수행하는 end-to-end 프로세스를 구현합니다. 이 과정을 통해 사용자의 질문에 대한 의미적으로 관련이 있는 답변을 생성할 수 있습니다.

  1. 검색 (Retrieval): vectorstore.as_retriever를 사용하여 MMR(Maximal Marginal Relevance) 검색 방식으로 문서를 검색합니다. search_kwargs에 k: 5와 lambda_mult: 0.15를 설정하여 상위 5개의 관련성이 높으면서도 다양한 문서를 선택합니다.
  2. 프롬프트 생성 (Prompt): ChatPromptTemplate를 사용하여 쿼리에 대한 답변을 생성하기 위한 템플릿을 정의합니다. 여기서 {context}는 검색된 문서의 내용이고, {question}은 사용자의 쿼리입니다.
  3. 모델 (Model): ChatOpenAI를 사용하여 OpenAI의 GPT 모델을 초기화합니다. 이 예에서는 'gpt-3.5-turbo-0125' 모델을 사용하며, temperature를 0으로 설정하여 결정론적인 응답을 생성하고, max_tokens를 500으로 설정하여 응답의 길이를 제한합니다.
  4. 문서 포맷팅 (Formatting Docs): 검색된 문서(docs)를 포맷팅하는 format_docs 함수를 정의합니다. 이 함수는 각 문서의 page_content를 가져와 두 개의 문단 사이에 두 개의 줄바꿈을 삽입하여 문자열로 결합합니다.
  5. 체인 실행 (Chain Execution): prompt | llm | StrOutputParser()를 사용하여 LLM 체인을 구성하고 실행합니다. 프롬프트를 통해 정의된 쿼리를 모델에 전달하고, 모델의 응답을 문자열로 파싱합니다.
  6. 실행 (Run): chain.invoke 메서드를 사용하여 체인을 실행합니다. context로는 포맷팅된 문서 내용이고, question은 사용자의 쿼리입니다. 최종 응답은 response 변수에 저장됩니다.

LLM의 각 기능들에 대한 실습을 주르륵 진행해 보았다. 각 기능들의 사용방식과 알고리즘에 익숙해져야 LLM을 원하는 대로 잘 다룰 수 있을 듯 하다. 그래도 예제들이 잘 구성되어 있고 설명이 친절하여 따라하기만 해도 꽤나 이해가 잘 되는 듯 한 착각을 불러일으킨다. 이제 다음 스텝으로 위 기능들을 Local(온프레미스)에 설치하기 위해 필요한 과정들을 진행할 예정.

 

추천글

https://wikidocs.net/book/14473

 

랭체인(LangChain) 입문부터 응용까지

**랭체인(LangChain) 입문부터 응용까지** 이책은 거대언어모델(LLM)을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 때 주로 활용되는 랭체인(LangCha…

wikidocs.net

https://github.com/tsdata/langchain-study/tree/main?tab=readme-ov-file

 

GitHub - tsdata/langchain-study: 랭체인(LangChain) 입문부터 응용까지

랭체인(LangChain) 입문부터 응용까지. Contribute to tsdata/langchain-study development by creating an account on GitHub.

github.com

 

'공부' 카테고리의 다른 글

[LLM] Ollama Local 설치  (0) 2024.05.28
[LLM] 자습 중. 참고 목록 모음집  (0) 2024.05.13
[LLM] 시작  (0) 2024.04.22
타닥타닥17: Superset Chart 및 Dashboard구성2  (0) 2023.08.15
타닥타닥16: Superset User&Role  (0) 2023.06.20
Comments