목차

오늘의 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문제풀이는 점점 어려워지고있는것을 체감합니다.

 

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

목차

오늘의 TIL 순서는

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

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


시작전 마음가짐

이번주 일정이 매우 빠듯합니다.

학습 1개만을 진득하게 할 수 있는 날은 없것 같은데요

여러가지를 만히 배우지만 한개를 진득하게 배운다고 생각하고 열심히 학습해서 모두 내것으로 만들어야겟습니다.

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


Python 문제풀이

1. 이어 붙인 수

  • join함수를 사용해서 완료
  • 다른 사람 풀이가 좋아서 2개 정도 같이 올림
# 나의 풀이
def solution(num_list):
    num_1 = ''.join(str(answer) for answer in num_list if answer % 2 == 0)
    num_2 = ''.join(str(answer) for answer in num_list if answer % 2 != 0)
    return int(num_1) + int(num_2)
# append사용 풀이
def solution(num_list):
    o=[]
    e=[]
    for n in num_list:
        if n%2:o.append(str(n))
        else:e.append(str(n))
    return int(''.join(o))+int(''.join(e))
# for문 사용 풀이
def solution(num_list):
    a=""#홀수
    b=""#짝수
    for i in num_list:
        if i%2!=0:
            a+=str(i)
        else:
            b+=str(i)
    return int(a)+int(b)

2. 마지막 두 원소

  • 완료
  • 리스트에 새로운 요소 추가 방법: append, insert, +=, extend, 슬라이싱
def solution(num_list):
    a = num_list[-1]
    b = num_list[-2]
    if a > b :
        num_list += [a - b]
    else:
        num_list += [a*2]
    return num_list

3. 수 조작하기 1

  • 반복문을 통해 쉽게 풀었다.
  • 에러가 나올 상황에 대처를 못했다.
  • 다른 함수를 이용해 쉽고 가독성 좋게 만들 수 있는 방법이 많았다.
# 나의 풀이
def solution(n, control):
    for i in control:
        if i == 'w':
            n += 1
        elif i == 's':
            n -= 1
        elif i == 'd':
            n += 10
        elif i == 'a':
            n -= 10
        else:
            pass # 다른 문자열이 왔을 때 넘어가기
    return n

# zip함수 풀이
def solution(n, control):
    key = dict(zip(['w','s','d','a'], [1,-1,10,-10]))
    return n + sum([key[c] for c in control])

# 딕셔너리 활용 풀이
def solution(n, control):
    answer = n
    c = { 'w':1, 's':-1, 'd':10, 'a':-10}
    for i in control:
        answer += c[i]
    return answer

LLM 특강 2일차

목차

  1. 프롬프트 엔지니어링
  2. 구조화된 추출
  3. 함수 호출

1. 프롬프트 엔지니어링

  • 맥락을 어떻게 주는지에 따라서 정확한 답을 얻거나 이상하게 나오거나한다.
  • 프롬프트에 따라서 응답 성능이 달라짐
  • 파인튜닝 보다 성능이 좋을 수 있다.
  • 많은 프롬프트 전략들이 정리가 되었다.(Open AI의 공식문서도 있다.)
  • 문서를 볼 때 딥엘 확장프로그램 사용하기

1) 맥락을 자세하게 짜라

  • 페르소나(역할)를 적용 시켜라
  • 마크다운 형식으로 작성하면 더 좋다.
  • few shot

2) reference text를 제공해라

3) 용도에 맞는 프롬프팅을 만들어야한다.

  • step 나누기
  • 맥락이 너무 길어지면 성능 저하

4) 이전 대화 내역을 필터링해서 성능을 유지 시켜라

5) 계산의 경우 풀이과정을 쓰게해서 답을 찾게하면 정확도가 올라간다.

6) 변경 점을 체계적으로 검증해야한다.

2. 구조화된 추출 Structured Output

1) type hint

  • 사용해도 안해도 괜찮다.
  • 함수 식에 영향을 주지않고 설명 역할

2) Pydantic

  • 데이터를 검사하고, 구조화할 수 있게 도와주는 라이브러리 `pytohn from pydantic import BaseModel

class CalendarEvent(BaseModel): name : str date : str participants : list[str] `

3. 함수 호출 Function Calling

  • 프로그래밍 된 함수를 LLM이 호출해서 사용해 결과를 출력Ex) gpt-4o는 2023데이터만 학습한 상태인데 프로그래밍 된 함수를 사용해 검색해서 2024 데이터를 활용하고 결과를 보여줄 수 있게할 수 있다.

개인과제

개인과제를 진행하며 프롬프트 마다 다른 상황과 역할을 부여하였습니다.

시스템 메세지에 {splits}를 넣어서 splits변수를 찾지 못하는 에러가 나왔고 이는 처음에 유니코드에러로만 나와서 어떤 에러인지도 파악하지못하고 상관없는 부분만 수정을 계속 진행하다.

재부팅을 하고 다시 실행하였을 때 변수를 찾을 수 없다는 에러가 나와 시스템 메세지에서 splits를 삭제해주니 정상작동하였습니다.

또한 프롬프트를 직접 입력주는 형태로 진행했는데 txt파일에 따로 작성한 뒤 불러오는 형태로 진행해야한다는 것을 이제야 알았습니다.

내일은 txt파일을 불러오고 답변을 저장하는 방법을 찾고 코드를 작성해서 비교까지 해볼아야겟습니다.


회고

전체적으로

오늘 학습은 시간을 버렸다고 생각합니다.

어떤 부분에서 에러가 나오는지 파악하지 모하고 에러코드로만 해결하려했던게 패착인것같습니다.

다른 학습과 강의는 물론 좋았고 알찻습니다.^^

Python 문제풀이를 하며

오늘은 지금까지 풀어본 문제들을 다시한번 풀어보는 시간을 같이 가졌습니다.

전에 이해하고 작성을 거리낌없이 했던 문제들도 헷갈려서 완성하지 못하는 문제들도 있었습니다.

다음에 조금 시간이 지난 뒤 한번더 이런 형태의 학습을 자주 진행해보아야할 것같습니다.

답이 외워지는 상황까지 반복할것입니다.

특강을 들으며 오늘의 LLM특강은 프롬프트 엔지니어링의 아주 자세하 설정까지 알아보는 시간이였습니다.

아직 3강이나 남았는데 또 어떤 내용이 나올지 궁금해집니다.

개인과제를 진행하며

오늘 개인과제의 진도를 쭉 빼고 싶었습니다.

완성이라는 단어를 사용할 정도로 진행하고싶었지만 어이없는 변수에러로 시작부분을 맴도는 느낌으로 시간이 끝나버렸습니다.

또한 모델에 프롬프트를 직접 입력하는 것이 아닌 텍스트 파일에 저장 해놓은 것을 불러오는 형태였다니 좌절감이 생기지만 확실하게 내가 해결해야하는게 무엇인지 분명해졌기 때문에 내일은 학습시간이 다 지나도 완성하지 못한다면 넘겨서 까지라도 완성을 해낼 것입니다.

목차

오늘의 TIL 순서는

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

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


시작전 마음가짐

오늘의 학습은 개인과제에 집중을 할 것입니다.

 

최대한 개인과제에 필요하고 메모해 놓았던 부분들을 실행시키는 것이 목표입니다.

 

python문제와 수준별학습반의 prompt강의도 궁금하네요

 

학습을 시작하겟습니다.


Python 문제풀이

1. 등차수열의 특정 항 더하기

  • range함수로 등차수열을 정의 했는데 값이 true, false이면 정의가 안됨
  • 등차 수열을 계산하는 코드식 찾아보고 해결
# 첫 번째
def solution(a, d, included):
    answer = range(a, len(included), d)
    for i in rnage(len(included)):
        if included[i]:
            return sum(answer[i + 1])

# 두 번째
def solution(a, d, included):
    answer = 0
    for i in range(len(included)):
        if included[i]:  
            answer += a + i * d  
    return answer

2. 주사위 게임

  • random함수를 사용해서 풀어보려 했으나 random으로 출력한 값을 변수로 지정하는 방법을 찾지못함
  • 하나씩 정의해가면 해결
def solution(a, b, c):
    ran_1 = a + b + c
    rna_2 = a**2 + b**2 + c**2
    ran_3 = a**3 + b**3 + c**3

    if a == b == c:
        return ran_1 * rna_2 * ran_3
    if a == b or b == c or a == c:
        return ran_1 * rna_2
    else:
        return ran_1

3. 원소들의 곱과 합

  • 고민은 조금있었지만 완료
def solution(num_list):
    answer_1 = sum(num_list)**2

    answer_2 = 1
    for num in num_list:
        answer_2 *= num

    if answer_1 > answer_2:
        return 1
    else:
        return 0

LLM 특강 1강

1. LLM은 어떻게 딥러닝을 통해 구현될 수 있었을까?

  • DNN(딥러닝): 입력층 -((가중치)> 은닉층....->출력층
  • 언어 모델에는 RNN을 보통 사용한다.
  • 과정: 데이터가 커지면서 기울기 소실문제가 발생해 해결하기 위한 방법이 나옴
    • LSTM
    • GRU
    • 하지만 RNN의 구조적인 한계(장기 의존성, 기울기 소실 문제)로 완전히 극복하지 못함
    • 그래서 Attention 기법의 도입
  • Transformers: RNN을 빼버리고 Attention만을 사용한 모델을 만들었는데 성능이 더욱 뛰어났다.
    • 앞의 노드 점수를 계산할 필요가 없어짐
    • 모든 노드의 점수를 동시에 계산할 수 있게 됨(GPU)
    • 장기의존성, 기울기 소실문제 개선
  • 결론: Transformers를 이용해서 데이터 사용양을 늘리수있었고 그로인해 LLM을 만들 수 있게 되었다.

2. LLM은 어떤식으로 배우게 되나요?

  • 공식 문서를 보고 코드를 쓸 줄 알아야한다.

3. LLM활용의 기본적인 컨셉트

  • Text Completion(텍스트 완성)에 특히 강점을 가지고있음
    • 맥락(Context)를 읽고 다음에 올 단어를 예측하여 문장을 완성하는 것
    • Context로 줄 수 있는 토큰의 사이즈가 커지니 다양한 일들이 가능해짐 ex) Prompt
  • Prompt: 사용자 질문만이 아니라 Prompt에 설정 된 문맥까지 다 읽고 기능
    • user
    • System
    • Assistant
  • Token 단위로 prompt를 읽어 온다.

4. LLM 사용해보기


개인과제 (LLM)

수정 필요!

  1. 백업 스토어 설정에서 InMemoryDocstore를 사용해보기
  2. 리트리버 변환에서 다른 변환 방법 찾아보고 적용 및 비교해보기
  3. 답변 방식을 바꾸는 프롬프트 방법 찾아보기
  4. 대화형 Chat봇 코드와 비교해 보았을 때 오히려 가독성이 떨어지게 출력이 되어 프롬프트 수정이 필요해 보임
  5. 백터 스토어 생성에서 FAISS.from_documents 대신 FAISS.from_embeddings 사용해서 결과 비교해보기
  6. 랭스미스 API키 받아서 LLM평가해보기

수정 진행!

1. InMemoryDocstore를 사용해보기

# 벡터 스토어 생성
from langchain_community.vectorstores import FAISS
from langchain_community.docstore.in_memory import InMemoryDocstore

vector_dim = len(embeddings.embed_query("example text")) 
index = faiss.IndexFlatL2(vector_dim)

vector_store = FAISS(
    embedding_function=embeddings,
    index=index,
    docstore=InMemoryDocstore(),
    index_to_docstore_id={}
)

2. 파라미터 조정

retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 2})

model = ChatOpenAI(model = "gpt-4o-mini", temperature = 0.3, max_tokens = 1000, stream = True)

3. 프롬프트에 추가한 명령

  • system: 인공지능 모델 연구자이십니다. 이 문서에서는 발전, 과제 및 주요 기여를 포함하여 초대형 언어 모델의 최신 연구 동향을 설명합니다. 귀하의 임무는 문서를 분석하고 상세하고 통찰력 있는 답변을 제공하는 것입니다.
  • user: 본 문서에 언급된 주요 동향과 연구 결과를 중심으로 포괄적인 답변을 부탁드립니다.
contextual_prompt = ChatPromptTemplate.from_messages([
    ("system", "You are an artificial intelligence model researcher. The document describes the latest research trends in super-large language models, including advancements, challenges, and key contributions. Your task is to analyze the document and provide a detailed and insightful response."),
    ("user", "Context: {context}\n\nQuestion: {question}\n\nAnswer: Please provide a comprehensive response, focusing on the key trends and research findings mentioned in the document.")
])

수준별 학습반

Prompt 점수 측정 방법

  • baseline prompt 작성
  • 다른 모델 prompt의 답변을 저장한다.
  • Rouge, G-Eval 사용하여 점수를 받고 프롬프트를 수정하며 점수를 높여간다.
  • 결론: 실습코드를 중간에 놓쳐서 완벽하게 따라해보지는 못했지만 어느정도 이해가 되는 수업이였습니다. 놓친 부분은 주말에 1~3강 복습을 해보고 개인과제에 적용을 하고 남은 기간동안 프롬프트 엔지니어링 과정을 문서화하는것을 복표로 해보아야겟습니다.

회고

전체적으로

 

오늘 학습은 꽤나 알찻다고 생각합니다.

 

오전 10시에 진행한 LLM특강 오후 7시에 진행한 API키 특강 오늘은 특강이 2개나 진행 되었고 수준별 학습반에서도 prompt engineering에 대한 강의가 있었습니다.

 

모든 정보를 이해했다고는 할 수 없지만 대부분은 이해가 가능했다고 말할 수 있습니다.

 

Python 문제풀이를 하며 

 

아직 기본기가 부족한 것 같습니다.

 

잠시 헷갈린거지만 바로 행동으로 옮겨지지 않은건데요 그것이 바로 기본인 리스트를 활용하는 방법과 연산기호를 사용해 결과를 가져오는 부분이였습니다.

 

지금까지 문제를 풀며 나온 작성법들과 혼동이 와서 그런 것 같습니다.

 

다음에는 이러한 기본적인 부분은 바로 사용방벙이 생각 날 만큼 학습을 진행야할듯합니다.

 

특강을 들으며 오늘은 2가지의 특강을 들었습니다.

 

오전의 LLM특강은 지금까지 궁금했던 LLM과 딥러닝의 연관성에 대한 내용이 나와서 흥미롭고 높은 이해도로 가져갈 수 있었습니다.

 

API특강은 우리가 친숙하게 사용했던 싸이트들의 API키를 발급 받고 사용방법 및 공식 API키 관련 문서읽는 방법에 대하여 알려주셨습니다.

 

각 싸이트마다 조금씩 다른 점이있지만 API키를 불러오는 방법의 진행방식이 매우 비슷하다 생각 들었습니다.

 

개인과제를 진행하며

 

개인과제 LLM에 대한 진도는 크게 나가지 않았지만 지금까지 진행하며 필요하다고 생각한 수정이 필요한 부분들이 필요한지 다음 단계에서 진행해야하는 것인지에 대해서 파악할 수 있었습니다.

 

또한 내가 만든 RAG체인을 활용한 대화형 LLM모델에 직접적으로 프롬프팅 엔지니어링을 하는 방법을 알게 되었습니다.

 

수준별 학습반 수업을 들으며

 

실습코드를 중간에 놓쳐서 완벽하게 따라해보지는 못했지만 어느정도 이해가 되는 수업이였습니다.

 

놓친 부분은 주말에 1~3강 복습을 해보고 개인과제에 적용을 하고 남은 기간동안 프롬프트 엔지니어링 과정을 문서화하는것을 복표로 해보아야겟습니다.

+ Recent posts