목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. JIRA, GITHUB 특강
  3. Streamlit 구현

시작전 마음가짐

오늘은 진짜 전체적으로 streamlit을 팀과제에 사용할 수 있게 만들 생각입니다.

 

중간에 특강이 하나 있는데 이 특강도 확실하게 습득하겟습니다.

 

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


JIRA, GITHUB 특강

JIRA특강을 듣고 현재 팀 과제에는 적용하면 좋겟지만 당장 적용하기에는 진행 되어있는 부분이 많아 진행하지 않을것입니다.

 

왜냐하면 팀 내부적으로 github의 프로젝트를 사용하는 방법을 공유하고 같이 학습한 사태이기 때문입니다.

 

하지만 다음 프로젝트부터는 적극적으로 도입하면 좋을거같다 생각합니다.

 

그리고 github랑 여결하는 부분이 애매하게 이해가 되어서 다음에 한번더 복습을 진행해야할듯 합니다

.


Streamlit 구현

본격적으로 팀과제에 도입을 하고싶어서 프론트엔드를 맡은 팀원과 상의해서 진행 방향을 정했습니다.

 

특강도 듣고 따로 학습을 진행했지만 모델에 연결하는 부분이 미흡하다는 생각으로 각자 학습을 통해 이해한 부분을 공유하고 다음 진해을 결정하는 방식으로 설계를 하였습니다.

 

오늘 학습을 마무리하며 공유를 했는데 어떤 부분에 이 코들를 넣으면 좋을지 즉, 아직 모델을 연결하는 부분까지는 구현 못해서 각자 어떤 세션을 구현할지 이야기를 나누었구요 그런데 제가 맡은 부분이 약간 도전과제 부분이라 확실하게 팀원들의 의견을 들어도 정해지짖 않았습니다.

 

왜냐하면 필수과제를 구현하는건 팀원분이고 저는 도전 과제를 구현하기로 했기 때문입니다.

 

새롭게 학습한 부분이 많지만 과제를 ㅇ어떻게 진행할지 감이 잡히질 않습니다.

 

조금더 깊게 그리고 기한에 맞게 생각하고 행공해야하지만 욕심을 버리기 어렵습니다.

 

프론트엔드 팀원끼리 정한 부분과 팀 전체적으로 정한 부분이 어긋났기 때문입니다.

 

다들 프로젝트를 진행하는게 처음이라 기획을 맡은 사람이있는게 아니라 진행상황을 보며 토론을 통해 진행을 계속 수저하고있기 때문이라 생각합니다.

 

기획이라는 부분이 중요하는걸 깨달았습니다.

 

감사합니다.

 

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. langchain 특강 2
  3. Streamlit 예습
  4. Stramlit 특강 4일차
  5. langchain 특강 3,4
  6. 회고

시작전 마음가짐

오늘은 전처리작업도 드디어 끝났겟다.

 

스트림릿을 모델에 연결하는 작업을 진행할 생각입니다.

 

빠르게 끝난다면 스트림릿을 이용해 최대한 꾸미는 작업도 해볼 생각입니다.

 

langchain특강 2를 어제 놓쳤는데 녹화본을 보며 학습을 시작하겟습니다.

(강의가 아직 올라오지 않아 streamlit예습을 먼저 하겟습니다.)


Stramlit 예습

아래 출처에서 RAG와 Streamlit을 연결한 챗봇을 만드는 방법에 대하여 학습하였습니다.

 

이번 학습으로 팀과제에 사용하면 좋을 부분이있어 참고하기 좋아보인다.

아래 docs를 활용해서 Streamlit의 ui구성하는 방법에 대하여 공부하였습니다.

 

끝까지 진행하려했지만 팀 회의에서 좋은 학습 방법이있어 다른 방법으로 학습하였습니다.

아래 출처를 활용해 코드와 홈페이지가 어떻게 구성 되는지 확인하며 요소 하나하나 공부하였고 이를 팀과제에 적용하게끔 바꾸어 주었습니다.

 

마지막에 깨달은 거지만 이 코드는 챗봇에 대한 소개를하는 화면이고 챗봇과 연결 되어있지는 않았습니다.

 

내일은 switch_page를 어떻게 사용하는지 학습할 예정입니다.


streamlit 특강 4일차

사용 파일

  • streamlit_d4.py

목표

  • 최적화 기법을 활용한 고급

Streamlit 데코레이터와 상태관리

  • 데이터 상태와 남아있는 데이터
    • 캐시(cache): 브라우저에 남아있는 데이터 (휘발성 데이터)
    • 브라우저에서 f12 입력 => Application => cache storage에서 데이터 확인 가능
  • 데코레이터(Decorator): def 함수가 실행 되기 직전에 바로 실행되는 함수

세션 상태 초기화 방법

  • 세션(Session): 인터넷 연결이 유지 돠는것 (나갓다 들어와도 유지 되는 것)
  • Streamlit 앱이 다시 로드될 때 상태를 유지하는 것

캐싱과 데이터 상태

HTML/CSS 기반 커스터마이징

  • CSS(Cascade Style Sheet/ 하강형 스타일 시트/ 웹페이지를 이쁘게 만들어 줌
  • javascpript와 연동

고급 레이아웃 설계

데이터 시각화와 심화


langchain 특강 3,4

이번 특강으로 langchain의 가장 어렵다고 생각한 부분과 추가기능 및 고급 기술을 구현하는 방법을 확인하였습니다.

 

재미있는 수업이였지만 실습을 하며 아~ 이런게 있구나 정도로 이해하고 넘어갓습니다.

 

아마 팀과제가 끝나고 나서 복습을 하면 좋을 것으로 생각합니다.


회고

현재 프로젝트의 흐름이 조금 빠그라졌다? 라고 생각합니다.

 

의견이 나오고 회의 때마다 좋다고 생각하는 쪽으로 의견수렴하는 형태로 진행하였는데 현재 가닥이 조금씩 잡히면서 이렇게할껄 이런 생각이 많이 든다고 생각합니다.

 

팀회의 때 솔직히 하기 어려운 이야기였지만 이후 진행과 기간에 맞추려면 지금까지 나온 의견에서 잘 판단해서 쳐낼건 쳐내야한다고 말을했는데 아무도 대답을 하지않아 조금 불만입니다.

 

그래도 의견을 어필하였다는데 의미를 둡니다.

 

이때까지 높은 완성도를 노리고 진행해왔기 때문에 말하기 어렵고 의견내기 어려운 주제여다고 생각합니다.

 

감사합니다.

목차

오늘의 TIL 순서는

  1. 시작전 마음가짐
  2. Stramlit 예습
  3. Stramlit 특강 2일차
  4. langchain 특강 1,2
  5. 회고

시작전 마음가짐

팀과제를 진행하며 구현해보고 싶은 것들은 많지만 어떻게 구현해야할지 감이 오지 않습니다.

 

이 작업을 하기 위해서 많은 공부가 필요해보입니다.

 

그래서 차근차근 지금 내가 알고있는 범위 내에서 공부를 해가며 학습 범위를 늘려 나갈 계획입니다.


Stramlit 예습

스트림릿으로 세션을 생성하고 저장해 활용하는 방법을 찾아보고 블로그의 글을 따라 진행해보았지만 적절한 설명이 없어서 내용을 이해하지 못했습니다.


Streamlit 특강 2일차

1. 컴포넌트 활용

1) 사이드 바 구성 2) 컬럼 레이아웃 3) 토글

2. 데이터와 상호작용

  • 파일 업로드
    • st.file_uploader: 드래그 앤 드랍으로 파일을 넣을 수 있다.
uploaded_file = st.file_uploader("CSV 파일 업로드", type="csv")
if uploaded_file:
    df = pd.read_csv(uploaded_file)
    st.write("데이터 미리보기:")
    st.dataframe(df)
  • 데이터 처리 및 시각화
if uploaded_file:
    st.write("컬럼별 데이터 요약:")
    st.write(df.describe())
  • 데이터 필터링
if uploaded_file:
    column = st.selectbox("필터링할 컬럼 선택", df.columns)
    value = st.text_input(f"{column}의 값을 입력하세요")
    if value:
        filtered_df = df[df[column].astype(str).str.contains(value)]
        st.write("필터링된 데이터:")
        st.dataframe(filtered_df)

3. 고급 시각화

  • plotly, matplotlib, seaborn
  • 막대(mark_bar), 산점도(scatter), 꺽은선(mark_line), 히스토그램(hist)등 생성 방법

langchain 특강 1,2

랭체인의 구조와 흐름을 간단하게 알아보고 어려운 부분을 설명하는 시간이였습니다.

  • 체인구조와 조건
  • 프롬프트 작성과 변수 넣기
  • Runnable 인터페이스(RunnablePassthrough())
  • StrOutputParser()
  • DebugPassThrough()

회고

오늘의 학습은 혼자 힘으로 gpt를 사용하지 않고 진행하였습니다.

 

그만큼 속도가 느려 많은 학습을 하지는 못했지만 뭔가 뿌듯함이 남습니다.

 

팀과제의 전처리 과정이 쉽게 끝나질 않습니다.

 

팀과제에 도움이 되기 위해서 스트림릿을 예습 진행 한 것인데 전처리 과정이 자꾸 삐긋하여 시간이 꽤 걸리는 것 같습니다.

 

아직 전처리 과정을 마무리하지 못해 마무리하고 학습을 마치겟습니다.

오늘은 팀과제를 위해 한글 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을 대신한다.

회고

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

 

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

 

버틸만해요

 

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

 

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

 

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

 

하하하!

 

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

 

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

 

감사합니다.

+ Recent posts