오늘은 팀과제를 위해 한글 PDF문서를 전처리 하는 과정을 어떤 전처리를 진행했는지 진행하며 알게 된 내용을 설명하며 진행하겟습니다.

사용할 기술

  • PYPDFLoader

1. 이미지 제거

  • PYPDFLoader는 텍스트를 주로 추출해서 모델에 전달해주는 라이브러리이기 때문에 이미지를 직접 삭제 해 주었습니다.
  • 이미지를 삭제하지 않고 진행하게 된다면 영어text와 특수기호로 바뀌게 되어 이를 배제하기 위해 영어 text가 누락 된다고 합니다.

이미지를 모델에 학습 시키는 방법

  1. OCR(광학 문자 인식) 도구를 사용하여 텍스트를 추출하세요. PyMuPDF 또는 Tesseract와 같은 OCR 기반 라이브러리를 사용해 텍스트를 추출할 수 있습니다.
  2. 이지미 삭제
  3. 이미지 설명을 텍스트로 변환하여 학습 (transformers의 BlipProcessor, BlipForConditionalGeneration)

2. 표 text로 수정

  • 전처리 없이 PYPDFLoader를 쓸 때: 표의 헤더와 데이터가 구분되지만, 모델은 이를 텍스트로 처리할 수 있을 뿐, 열과 행의 관계는 명확히 이해하지 못할 수 있다고 합니다.
  • 개행 빈줄 불용어 전처리를 거치면 모델이 이해 불가

해결 방법

1) 마크다운 형식으로 고치기 2) json형식으로 작성 3) csv형식으로 작성

3. 링크 걸린 텍스트에 URL 추가

ex) 여기에 자료 : https://www.URL/

  • 모델이 직접 PDF 파일 내에 포함된 링크를 직접 "클릭"하거나 외부 리소스를 가져와 활용하지 않는다고 합니다.
  • 링크가 걸려있지만 text만 추출하기 때문에 참고자료로 활용할 수 없다고 합니다.

4. 없어졌거나 안들어가지는 링크 제거

  • 각 싸이트의 내용과 링크의 유지보수성을 고려했습니다.
  • 당장 링크에 들어가지기만 하면 된다고 판단하고 진행했습니다.단기 프로젝트이기 때문

5. 문서 내용 추가

  • 정보를 추가하여 목표하는 성능이 나올 수 있게 내용을 추가 해 주었습니다.
  • 각 단락의 Reference 링크를 참고하여 추가했습니다.

진행하며 전처리에 관한 궁금증 해결

질문 :

  • PYPDFLoader로 문서를 불러올 때 개행 빈줄 불용어 제거 및 토큰화, 요약, 문법 수정, 불필요 문자 제거 등의 작업이 필요한가요?

답변:

  • 개행 및 빈줄 제거:
    • 텍스트 분석이나 질의응답과 같은 작업에서는 불필요한 공백이나 개행을 제거하는 것이 유용할 수 있다고 합니다.
    • 페이지 레이아웃을 유지해야 하는 경우는 진행하지 않는게 종다고 합니다.
  • 불용어 제거:
    • 주요 내용이나 핵심 문장을 추출하고자 한다면 불용어를 제거하는 것이 도움이 될 수 있다고 합니다.
    • 문맥이나 자연어 이해가 중요한 경우 불용어를 제거하면 의미를 왜곡할 수 있으므로 불용어 제거를 하지 않는 것이 좋을 수 있다고 합니다.
  • 토큰화:
    • 자연어 처리나 텍스트 마이닝, 정보 검색 등의 작업에서는 토큰화가 필요하다고 합니다.
    • 질의응답이나 검색 시스템에서는 텍스트를 보다 잘 분석하고 인덱싱하기 위해 토큰화가 필수적이라고 합니다.
  • 요약:
    • 문서가 너무 길거나 핵심 정보만 추출하고 싶을 때 요약을 적용하는 것이 유리하다고 합니다.
    • 전체 문서의 모든 내용을 사용하는 것이 중요하다면 요약이 필요 없을 수 있습니다.
  • 문법 수정, 불필요 문자 제거
    • 특수 문자, 중복 텍스트, 잘못된 문법 등이 포함될 수 있기 때문에 자료를 잘 파악하고 진행해야 합니다.

결론

PyPDFLoader로 문서를 불러올 때는 문서의 형태와 목표 작업에 따라 개행, 빈줄, 불용어 제거, 토큰화, 요약 등의 전처리 작업을 할지 말지를 결정해야 할것으로 생각이 듭니다.

  • 텍스트 분석 및 정보검색에선 위의 과정이 필요할 수 있다고 생각합니다.
  • 원본 텍스트 보존이 중요한 경우에는 위 과정을 잘 선별해야 한다고 생각합니다.

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. Python 문제풀이
  3. base 지식 탐구(ASCII, 문자열 함수)
  4. Streamlit 특강
  5. 수준별학습반: 딕셔너리 특강
  6. 회고

학습 내용은 GITHUB링크를 참고해 주세요

 

TIL/Python/문자열 함수.ipynb at main · Onesword-Jang/TIL

오늘 배운 것은?! Contribute to Onesword-Jang/TIL development by creating an account on GitHub.

github.com

 

 

TIL/base/ASCII.ipynb at main · Onesword-Jang/TIL

오늘 배운 것은?! Contribute to Onesword-Jang/TIL development by creating an account on GitHub.

github.com

 


시작전 마음가짐

오늘은 2가지의 특강이있으며 팀 프로젝트의 전처리과정과 streamlit 예습을 주로 진행할 것 같습니다.

 

어제 진행하지 못한 Python문제풀이까지 모두 마치는것이 목적입니다.

 

목차로 일정을 정리하니 학습 내용이 조금 부족하다는 생각이 들지만 당장 무엇을 학습해야할지 떠오르지 않아 학습을 진행하며 추가해 진행할 예정입니다.

 

그럼 일정을 다 계획했으니 학습을 시작하겟습니다.


Python 문제풀이

1. 콜라츠 수열 만들기

  • while조건 문과 식의 대입은 맞췃지만 아직 문법 정리 및 조건 정의가 어색해서 몇번 수정 후 완료
def solution(n):
    answer = [n]

    while n != 1:
        if int(n) % 2 == 0:
            n = n/2
        else:
            n = 3*n+1
        answer.append(n)
    return answer

2. 배열만들기 4

  • 10초 이상이 걸린다고 실패 => 불필요한 욧 제거 필요
  • for문 제거 후 기대값이 다름
  • 자잘한 문법 사용 방법에 어색함
# 내가 푼 문제
def solution(arr):
    stk = []
    i = 0 
    while i < len(arr):
        for i in range(len(arr)):
            if stk == []:
                stk.append(arr[i])
                i += i + 1
            elif stk[-1] < arr[i]:
                stk.append(arr[i])
                i += i + 1
            elif stk[-1] >= arr[i]:
                stk.pop()

    return stk

# 솔루션 후 풀이
def solution(arr):
    stk = []
    i = 0  

    while i < len(arr):
        if not stk:  
            stk.append(arr[i])
            i += 1
        elif stk[-1] < arr[i]:  
            stk.append(arr[i])
            i += 1
        else:  
            stk.pop()  

    return stk

3. 간단한 논리연산자

  • 처음보는 문자로 and, or이 정의되어있어서 간단한 검색 후 진해
def solution(x1, x2, x3, x4):
    return (x1 | x2) & (x3 | x4)

4. 주사위게임

  • 학습하며 set에 대한 이해도가 부족하다고 생각이 들어서 조금 공부해왔습니다.
    • set 자료형을 정말 유용하게 사용하는 경우는 교집합, 합집합, 차집합을 구할 때
    • set 자료형은 인덱싱으로 불러올 수 없어 리스트나 튜플로 변환 시키고 수행해야한다.
    • 1개 값 추가 하기 set.add()
    • 여러 개의 값 추가 하기 set.update()
    • 제거 set.remove()

5. 글자 이어 붙여 문자열 만들기

  • 완료
def solution(my_string, index_list):
    answer = ''
    for i in range(len(index_list)):
        answer += my_string[index_list[i]]
    return answer

6. 9로 나눈 나머지

  • 완료
def solution(number):
    answer = 0
    number = int(number) % 9
    answer += number

    return answer

base 지식 탐구

1. ASCII 문자란?

  • 문자와 숫자를 매핑하는 표준 코드 체계입니다.
  • 컴퓨터가 문자를 숫자로 저장하고 처리할 수 있도록 설계된 초기 문자 인코딩 시스템입니다.
  • 아스키 코드는 총 128개의 문자로 구성
  • 7비트로 표현

파이썬에서 자주쓰는 제어문자 = ASCII

  • 줄바꿈 \n
  • 탭 \t
  • 캐리지 리턴 \r
  • 널 문자 \0

아스키 문자의 활용 방법

  1. 데이터 전송
  2. 문자전환
  3. 암호화/복호화

2. 문자열 함수


Streamlit 특강 1일차

소개 및 설치

  • 특징
    • 쉽고 간단한 문법으로 빠르게 결과를 웹으로 만들 수 있다.
  • 설치 `python pip install streamlit

import streamlit as st

import streamlit as st
import pandas as pd
import numpy as np

- Text 작성
 - st.title("스파르타코딩클럽 AI 8기 예제")
 - st.header("지금 스트림릿 예제를 만들고있습니다")
 - st.text("따라가고있어요")
 - st.markdown("### 마크다운 헤더 문법입니다.")

- 수식
 - st.latex("E = mc^2")

- 버튼 생성 및 동작
if st.button("눌러주세요"): st.write("글씨가 생겨요")

 

- 상호작용 위젯 만들기
agree_box = st.checkbox("동의 하시겠습니까?") if agree_box is True: st.write("동의 하셨습니다.")

 

- 슬라이더 위젯
volume = st.slider("음악 볼륨", 0, 100, 50) st.write(f"음악 볼륨은 {volume}입니다.")

 

- 라디오 버튼
gender = st.radio("성별", ["남자", "여자"]) st.write(f"성별은 {gender}입니다.")

 

- 셀렉트 박스
flower = st.selectbox("라벨", ["1번", "2번", "3번"]) st.write(f"선택한 라벨은 {flower}입니다.")

 

- 데이터 프레임 시각화
df = pd.DataFrame({ "이름": ["장준영", "장한검", "양지아"], "출생년도": ["1996년 11월 04일", "1996년 11월 04일", "2018년 10월 12일"] })

st.write("### 데이터프레임 출력") st.dataframe(df) # 동적으로 크기를 조정 가능한 데이터프레임 st.table(df) # 정적 테이블

 

-  차트 데이터
st.write("### 랜덤 데이터로 라인 차트 그리기") chart_data = pd.DataFrame( np.random.randn(20, 3), # 20개의 행과 3개의 열을 가진 랜덤 데이터 생성 columns=["a", "b", "c"] # 열 이름 지정 )

st.line_chart(chart_data)

 

- 막대 차트 데이터
st.write("### 학생 점수로 막대 차트 그리기") chart_data_2 = pd.DataFrame({ "학생번호": ["1", "2", "3", "4"], "점수": [80, 100, 40, 50] })

st.bar_chart(chart_data_2.set_index("학생번호")) # 학생번호를 인덱스로 설정하여 차트 그리기

 

`


수준별 학습반: 딕셔너리 특강

1. 딕셔너리란?

  • key, value 쌍으로 값이 들어있는 데이터
  • key는 고유식별자로 바뀔 수 없다.
  • key에는 불변한 데이터타입만이 올 수 있다.

2. 사용함수

  • del: 키값 삭제

3. 사용 메서드

  • items(): key,value 불러오기
  • keys(): key값 불러오기
  • values(): value값 불러오기
  • get('키 값', 'none대신 나올 말'): key에 해당하는 value값을 불러오고 없다면 2번째 파라미터로 none을 대신한다.

회고

오늘은 조금 쉬어가는 느낌이 드는 하루였습니다.

 

그만큼 어제가 힘들었다는 이야기일 수 있겟어요ㅎㅎ 몸은 그대로 피로 축적이지만 괜찮습니다.

 

버틸만해요

 

언제나 생각하듯이 조금 더 높은 곳에 올라가려 시도를 하면 가장 아래 부분이 휘청인다는 느낌을 많이 받았습니다.

 

그래서 틈이 나는대로 기초적이지만 내가 모르고 내용을 알면 머리가 아파질만한 내용을 공부했어요.

 

진짜 생각했던 그대로 부실하더군요 물론 지금도 같습니다. 이렇게 초석 부분에 돌을 하나 더 끼워 넣었으니 조금 더 단단해졌습니다.

 

하하하!

 

오늘의 학습은 매우 만족 스러웠고 아쉬운 부분은 없었습니다.

 

하지만 아직 팀과제의 전처리 부분에서 판단 미스로 다시 전처리를 진행하는 과정을 거치고 쉬도록하겟습니다.

 

감사합니다.

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. 팀 회의
  3. LLM 특강
  4. GIT 관련 유튜브 팀원과 동시 시청
  5. 회고

시작전 마음가짐

오늘은 팀과제인 프로젝트를 제작하는 첫날입니다.

 

팀회의를 통해 잘 조정해가며 만족스러운 과제가 진행이 되었으면 합니다.

 

그럼 학습을 시작하겟습니다.


팀회의

오늘의 팀회의는 팀 프로젝트를 진행하기 앞서 전체적인 부분을 정하는 날이였습니다.

 

기본적으로 팀장님께서 진행을 해주셨고 정보를 취합해주셨습니다.

 

하지만 정해야하는 내용이 많아 회의만 4 ~ 5 시간을 진행해서 조금 힘들었습니다.

 

하지만 의견, 건의 등 자유롭게 말할 수 있어 많은 부분을 공유하고 같이한다는 느낌이 들어 좋기도했습니다.

 

또한 팀회의에서 약간의 이슈가 발생했지만 서로 배려하면 잘 넘어갓습니다.

 

6조 화이팅!!


LLM특강 5일차

1. LangChain

  • AI모델의 능력을 극대화하고, 개발과정을 간소화 한다.
  • invoke의 개념 (call이라 생각하면 된다.)
  • invoke가 가능한 객체는 learnable이라 부름
    • model
    • parser
  • Chain이란: 파이프 연산자 '|'를 사용해서 learnable객체 끼리 연결 (입출력이 있는 함수면 사용 가능)

2. RAG

  • 과정
    • 데이터 로더 => 스플릿("Recursive Character Split") => 임베딩("Chroma", "OpenAIEmbeddings") => 벡터스토어에 저장 => 리트리버 변환 => 프롬프트 템플릿 작성 => 입력 질문과 비슷한 문장을 리트리버로 "문맥 Docs" 가져오기 => "질문 Docs" 포맷팅 및 프롬프트의 {question}에 "질문 Docs" 넣기("RunnablePassthrough") => 프롬프트의 {context}에 "문맥 Docs" 넣기 => 프롬프트를 모델에 전달하고 결과 생성 => text출력("StrOutputParser")

GIT 관련 유튜브 팀원과 동시 시청

  • 과정
    • 레포 만들기 => 팀원 초대 => develop 브렌치 만들기 => 마스터 브랜치 block 설정 => 팀 프로젝트 보드 개설 => 이슈 마다 브렌치 만들기 => 작업 후 push => PullRequste에 확인 요청 => 코드 리뷰 & 승인 => develop에서 merge => main브랜치
  • 이슈 보드
    • add item => 작업 이름 작성 => convert to issue의 작성 레포 클릭 => creat branch에서 develop설정 후 creat클릭 => 작업 상황에 맞게 보드 조작
  • vscode에서 브랜치 열기
    • git clone "URL" => 터미널에서 해당 파일 들어가기 => git fetch origin => git checkout '브랜치' => 작업 시작

회고

아 오늘은 한번도 진행해보지 못한 주제를 처음부터 끝까지 손봐야하는 주제가 떨어져서 힘들었습니다.

 

팀 회의를 이렇게까지 진득하게 해본것도 처음이였고 팀내에서 의견을 이렇게 많이 내는것 그리고 회의도중 의견차이를 좁히는 과정 등 모든 과정이 처음이였습니다.

 

팀원분들이 서로 배려해주고 의견을 표출도 잘하시고 해서 오래동안 회의를 진행하였고 만족스러운 결과가 나왔다고 생각합니다.

 

개인 공부를 이 커리큘럼에서 가장 적게한 날이지 않을까 싶을 정도로 회의를 오래했지만 LLM특강, 수준별 학습반 강의 등 정해진 일정이있어서 학습하는 부분에 아무런 이득이 없는 하루는 아니였습니다.

 

또한 회의를 통해 얻은 결과물이 만족스럽다고 생각이 듭니다.

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. Python 문제풀이
  3. LLM 특강
  4. 딥러닝 복습
  5. GIT 특강1
  6. 회고

시작전 마음가짐

오늘은 팀과제 발제가 있습니다.

 

19시에 발제가있고 그전에 특강들이 3가지 정도 준비 되어있습니다.

 

개인 학습의 양을 조금 줄이고 일정 소화하는데 집중해야겟습니다.

 

그럼 학습을 시작하겟습니다.


Python 문제 풀이

1. 수열과 구간 쿼리

  • i % k 가 왜 조건이 되는지 이해가 안감
# 내 틀린 풀이
def solution(arr, queries):
    for s, e, k in queries:
        for i in range(s, e + 1):
            if arr[i] % k == 0:
                arr[i] += 1  
    return arr
# 검색을 통한 풀이
def solution(arr, queries):
    for s, e, k in queries:
        for i in range(s, e + 1):
            if i % k == 0:
                arr[i] += 1  
    return arr

2. 배열 만들기2

  • 리스트 컴프리헨션을 잘 사용하고싶다.
  • all함수를 이용하는 방법이 가장 간단해 보인다.
# 틀린 풀이
def solution(l, r):
    answer = []
    for i in range(l, r+1):
        if str(i) == '0' or str(i) == '5':
            answer.append(i)
        else:
            answer.append(-1)
# 검색을 통한 풀이
def solution(l, r):
    answer = []
    for i in range(l, r + 1):  
        if all(a in '05' for a in str(i)):  
            answer.append(i)
    return answer if answer else [-1]

3. 카운트 업

  • 완료
ef solution(start_num, end_num):
    answer = []
    for i in range(start_num, end_num + 1):
        answer.append(i)

    return answer

# 간단한 정답
def solution(start, end):
    return [i for i in range(start,end+1)]

LLM 특강

1. LLM의 문제

  • 맥락이 없는 상태인 챗봇에 맥락을 알려줘야한다.
  • 할루시네연: 없는 정보를 만들어 내서 전혀 상관없는 정보를 만든다.

2. RAG의 배경지식

  • Retrieval-Augmented Generation 검색증강생성
  • 과정
    • 연관 문서 저장 => 문서 쪼개기 => 질문에 맞는 문서 내용 찾기 => 결과 출력
  • 문서 내용 찾는 방법
    • 비슷한 텍스트를 찾아낸다.(유클리드 거리를 계산을 통해 유사도를 구할 수 있다.)
    • 임베딩을 활용해 데이터 포인트의 위치를 찾을 수 있다.
  • 이렇게 찾은 데이터 포인트들의 좌표값을 벡터 스토어에 저장한다.

3. AnyThingLLM 실습

  • AnyThingLLM 다운
  • LLM, 임베딩 모델 선택 등 설정 값 조정
  • 로컬환경의 파일 불러와서 임베딩 클릭하고 바로 실행 가능

딥러닝 복습

1. 인공지능, 머신러닝, 딥러닝의 관계

  • 인공지능(AI) : 인공지능은 인간의 지능을 모방하여 문제를 해결하는 기술을 의미합니다. AI는 규칙 기반 시스템부터 자율 학습 시스템까지 다양한 접근 방식을 포함합니다.
  • 머신러닝(ML) : 머신러닝은 데이터를 이용해 모델을 학습하고, 이를 통해 예측이나 결정을 내리는 기술입니다. 머신러닝은 AI의 하위 분야로, 지도 학습, 비지도 학습, 강화 학습 등의 방법을 포함합니다.
  • 딥러닝(DL) : 딥러닝은 머신러닝의 하위 분야로, 다층 신경망을 사용하여 데이터를 학습합니다. 딥러닝은 특히 대규모 데이터와 복잡한 문제를 다루는 데 강력한 성능을 발휘합니다.

2. 활성화 함수

  • ReLU
  • Sigmoid
  • Tanh(Hyperbolic Tangent)

3. 손실 함수

  • MSE(평균 제곱 오차): 예측 값과 실제 값의 차이를 제곱하여 평균(회귀문제)
  • Cross-Entropy(교차 엔트로피): 예측 확률과 실제 클래스 간의 차이 측정(분류문제)

4. 최적화 알고리즘

  • SGD: 랜덤의 일부데이터(미니배치)를 사용해 기울기를 계산하고 업데이트
  • Adam: 학습률을 적응적으로 조정

5. 딥러닝 활용

  • 회귀문제
  • 이진 분류 문제
  • 다중 클래스 분류 문제
  • 특징 추출(이미지, 이차원 데이터)
  • 시계열 데이터, 순차적인 데이터 처리 및 예측
  • 자연어 처리 및 예측

6. 하이퍼 파라미터

  • 사용자가 설정해야하는 값으로 모델성능에 영향을 미치는 것
    • 학습률: 가중치를 업데이트하는 속도 결정
    • 배치크기: 한번의 업데이트에 데이터 샘플 수
    • 에포크 수: 전체 데이터 셋 몇번 반복 학습 결정
    • 모멘텀: 이전 기울기 반영 여부 결정
    • 가중치 초기화: 모델의 가중치 초기화 방법

7. 하이퍼 파라미터 자동 튜닝 기법

  1. Grid Search: 모든 조합을 시도
  2. Random Search: 무작위로 값을 선택해 최척화
  3. Bayesian Optimization: 이전 결과 바탕으로 다음 평가의 하이퍼파라미터 결정

GIT특강 1일차

협업 시나리오

    1. beanch를 나누는 방법
    2. main: 기준이 되는 브렌치
    3. develop: 개발을 하고있는 브렌치
    4. feature: 개발 중인 기능 중에 하나를 나타내는 브랜치
    1. branch 이동 방법
    2. 브랜치 생성: git branch '이름'
    3. 브렌치 이동: git checkout '이름'
    4. 브렌치 병합: git merge feature-branch
    1. merge충돌 확인 방법
    2. git log --merge: 병합 충돌이 발생한 파일의 이력을 확인
    3. git diff: 충돌 내용을 비교하여 변경사항을 확인
    1. 이슈 트래킹: 보충 필요
    1. 풀 리퀘스트: 보충 필요
    1. 협업 때 좋은 프로그램
    2. 소스트리 :https://www.sourcetreeapp.com/
    3. 깃허브 데스크탑: https://desktop.github.com/download/
    4. 깃 크라켄: https://www.gitkraken.com/

회고

오늘은 일정이 많아 조금 힘이 들었습니다.

 

하지만 일정 외에 개인 공부는 알찻다고 생각합니다.

 

다시 딥러닝 복습할 때는 이 것을 이해하기 위해 얼마나 다시 시간을 갈아 넣어야하나라는 생각이있었습니다.

 

그래서 전체적으로 간단하게 보면서 기본중의 기본이라 생각이 드는 부분을 복습하였습니다.

 

또한 오늘 팀과제 발제가있었는데 생각보다 프로젝트를 한다는게 얼마나 할 일이 많고 어려운지 알게 되는 시간이였습니다.

 

발제만 들었을 때는 무엇을 어떻게 해야하지 이런 생각 밖에 들지않아 와닿지 않았습니다.

 

내일 팀 회의 통해 가닥이 잘 잡혔으면 좋겟습니다.

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. Python 문제풀이
  3. LLM 특강
  4. 개인과제 수행
  5. 회고

학습 코드와 필기내용은 GITHUB링크를 이용해주세요


시작전 마음가짐

오늘은 외출 예정이여서 6시 20분 부터 학습을 시작하였습니다.

 

시작은 개인과제의 도전과제 마무리 하는 것을 목표로 진행하고 도전과제를 마무리하면 Python문제풀이, LLM특강 순서로 진행하겟습니다.

 

새벽부터 시작하서 조금 피곤하지만 정신 차리고 학습을 시작하겟습니다.


Python 문제풀이

1. 수 조작하기 2

  • if문은 이해가가는데 for문과 diff정의가 이해가 안감
def solution(numLog):
    # 결과 문자열을 저장할 변수
    result = ""

    # numLog 배열의 차이를 순회하며 문자열을 구성
    for i in range(1, len(numLog)):
        diff = numLog[i] - numLog[i - 1]
        if diff == 1:
            result += "w"
        elif diff == -1:
            result += "s"
        elif diff == 10:
            result += "d"
        elif diff == -10:
            result += "a"

    return result

2. 수열과 구간 쿼리3

def solution(arr, queries):
    # 각 쿼리의 [i, j]에 따라 arr의 값을 교환
    for i, j in queries:
        arr[i], arr[j] = arr[j], arr[i]
    return arr

3. 수열과 구간 쿼리2

  • 빈 리스트를 왜 2개 정의하는지 이해가 안감
    • 최솟값을 구해야해서 2개를 청의하는 건가?
  • query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]
    • for i in range(s,e+1): if arr[i] > k: answer.append(min(l))
# 내가 틀린 문제
def solution(arr, queries):
    answer = []
    for i in range(1, len(arr)):
        for a,b,c in queries:
            if a <= arr[i] <= b and arr[i] > c:
                answer.append(min(arr[i]))
            else:
                answer.append(-1)

    return answer

# solution검색하고 틀림
def solution(arr, queries):
    answer = []
    for a, b, c in queries:
        # 조건에 맞는 값 중 가장 작은 값을 찾기
        valid_values = [num for num in arr if a <= num <= b and num > c]
        if valid_values:
            answer.append(min(valid_values))  # 가장 작은 값 추가
        else:
            answer.append(-1)  # 조건에 맞는 값이 없으면 -1 추가
    return answer

# solution 검색 후
def solution(arr, queries):
    answer = []
    for s, e, k in queries:
        l = []
        for i in range(s,e+1):
            if arr[i] > k:
                l.append(arr[i])
        if l:
            answer.append(min(l))
        else:
            answer.append(-1)

    return answer

개인과제(LLM)

코드 수정 및 추가

1. txt파일로 프롬프트 적용

  1. select_prompt 정의(items, get, open, read)
    • items: 키, 값을 튜플로 묶어 반환
    • get: choice(사용자 입력 값)을 키로 값(prompt)를 반환
    • open:파일 열어서 읽기 모드('r')
    • read: 파일 불러오기
  2. langchain.prompts.chat 정의(ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate )
    • ChatPromptTemplate: 다른 두 템플릿을 결합해서 대화형식 메시지로 구성
    • SystemMessagePromptTemplate: 모델의 역할(system_message) 지정
    • HumanMessagePromptTemplate: 사용자의 질문({user_input}) 지정

2. RAG체인 구성 변환

1) LLMChain 추가

  • 템플릿을 기반으로 여러 메시지를 조합하고 모델에 전달
  • contextual_prompt을 처리하고, 모델을 실행하는 방식으로 변경

2) ContextToText 클래스 수정

  • LLMChain에 맞게 RunnablePassthrough를 상속 받지않고, 단순 메서드 정의

3) 실행방식 변경(파이프라인=>get_contextual_response())

  • 사용자의 질문에 대한 컨텍스트를 가져오고, 이를 chat_prompt 템플릿에 맞게 포맷팅하여 모델에 전달
  • retriever.get_relevant_documents(query): 질문에 맞는 문서들을 검색
  • ContextToText 클래스에서 변환된 텍스트는 formatted_messages에 담겨 모델에 전달

3. 반복 질문 삭제

  • while루프 제거

4. 답변 txt파일로 저장 코드 추가

  • output_folder: r포맷팅으로 저장 경로 지정
  • os.makedirs: 폴더안에 저장 지정
  • timestamp: 현재 년,월,일,시,분,초를 txt파일 이름으로 지정
  • open: 쓰기모드('w")를 지정

LLM 특강 3일차

1. Local LLM

  • VRAM: Video RAM으로 그래픽 카드에서 사용하는 램, 일반적인 컴퓨터에서는 RAM과 별도로 운영 되며 그래픽카드에 포함되어있다.
    • 로컬에서 사용하기 위해선 16GB의 VRAM공간이 필요
  • LLM 모델 축소 방법
    • 양자화: 실수형 파라미터들을 정수형 파라미터로 바꿔서 사용(성능의 저하가 있음)
    • sLLM/SLM:애초에 작은 사이즈를 염두에 두고 학습한 언어모델(Gemma, phi3)
  • 실습 (ollama): 다운과 사용이 프롬프트로 한다.
    • ollama: 로컬 환경에 llm모델을 다운받아 사용가능하고 파인튜닝 등의 작업 가능
    • LM Studio: hugging face에 올라와있는 다양한 유저 커스텀 모델을 간단하게 사용 가능(파인튜닝 등의 복잡한 단계는 hugging face에서 가능)

vram용량 부족 시 llm모델을 끄면 된다.

# 오라마 인터페이스 다운

# bash
ollama run llama3.2 # 모델마다 필요 vram크기가 다름

# send a massage
Hi how are you
# 답변
Hi! i'm .....

# 1. LM Studio 다운
# 2. 원하는 모델을 검색해 유저들이 올린 모델 다운
# 3. LM Studio 인터페이스에서 모델 적용 및 프롬프트 작업, chat기능을 사용할 수 있다.

회고

오늘은 피곤해서 전체적으로 쓰겟습니다.

 

아침 6시부터 시작한 학습은 매우 힘들었습니다.

 

외출을 하러가서도 쪽잠을 자는 등으로 컨디션을 겨우 유지했습니다.

 

그래도 개인과제의 도전과제까지 완료하였고 제출했습니다. 기쁨니다.

 

LLM특강도 로컬에서 LLM을 사용하는 방법에 대하여 배웠는데 저는 환경이 되지않아 실습은 해보지 못했습니다.

 

Python문제풀이는 점점 어려워지고있는것을 체감합니다.

 

이제는 이해가 안되는 부분도 많아져서 강의 때 열심히 듣고 질문해야겟습니다.

+ Recent posts