본문 바로가기
데이터 AI 인사이트 👩🏻‍💻/KPMG 교육

비즈니스 애널리틱스 I (3) 텍스트 분할 & 임베딩, 벡터 유사도 분석, 형태소 분석, 네이버 쇼핑몰 데이터 RAG

by odimilk 2025. 1. 26.

정크 사이즈 > 정크 오버랩

chunk_size와 chunk_overlap은 텍스트 데이터를 일정 크기(chunk_size)로 나누는 과정에서 겹치는 부분의 크기(chunk_overlap)를 설정하는 매개변수이다. 이는 주로 텍스트 분할 작업에서 사용되며, 텍스트 처리 및 분석, 특히 자연어 처리(NLP) 모델에 데이터를 입력하기 전에 텍스트를 잘게 쪼개는 데 유용하다.

예시: chunk_size=5, chunk_overlap=1

입력 텍스트가 다음과 같다고 가정: "abcdefg"

['abcde', 'bcdef', 'cdefg']

 

프로그래머들은 계속 숫자 바꿔가면서 테스트를 한다.

글자가 계속 겹치면서 나온다는 의미이다. 단어가 기존의 형태소 분석에서 두글자씩을 청크라고 하면 오버랩은 두개씩 해줘야 다 나올 수 있지만 데이터양이 많아져서 문제이다.

융합_삼정 처럼 언더바 _가 있으면 글자 간 구간을 구분을 잘 해준다. 이거는 설계 하는 사람의 몫이다. 인공지능 쪽이 자동화가 적용된 곳인데도 불구하고 딥러닝 배우면 알겠지만 이런 부분은 순수하게 사용자의 감이다. 그렇기 때문에 많이 써봐야 한다. 단어들이 명확하게 명사화가 되어있지 않은 용어들이 많다면 오버랩을 많이 하는 수 밖에 없다. 그렇기 때문에 해봤던 것을 많이 확인하는 것이 좋다.


유사도 분석

# 1단계: 임베딩 모델 초기화
embeddings_model = OpenAIEmbeddings()

# 2단계: 임베딩할 텍스트 정의
texts = [
    "The history of Rome is fascinating.",
    "The French Revolution started in 1789.",
    "The Great Wall of China is one of the seven wonders.",
    # 여기에 더 많은 텍스트를 추가하세요...
]

# 3단계: 텍스트로부터 Chroma 데이터베이스 생성
db = Chroma.from_texts(
    texts=texts,  # 데이터베이스에 저장할 텍스트 리스트
    embedding_model=embeddings_model,  # 임베딩을 생성하는 데 사용할 모델
    collection_name="history",  # 임베딩을 저장할 컬렉션의 이름
    persist_directory="./db/chromadb",  # 데이터베이스를 저장할 디렉토리
    collection_metadata={'hnsw:space': 'cosine'}  # 유사도 검색을 위한 메타데이터 (예: 코사인 유사도)
)

# 이제 데이터베이스가 설정되었으며 사용할 준비가 완료되었습니다!

텍스트 임베딩 모델을 사용하여 주어진 텍스트 데이터를 벡터로 변환하고, 이를 Chroma라는 벡터 데이터베이스에 저장하여 이후 검색 및 유사도 측정을 용이하게 하는 역할을 한다.

지피티에 검색:

Norm: 벡터의 길이

인공지능이든 머신러닝이든 잘하려면 많이 하면 된다. 많이 하려면 자꾸 틀리면 된다. 일부러 패널티 주는 방법론 중 하나가 L1, L2를 주는 것이다. 머신러닝에 그런 기법이 있다. 잘되는 데에다가 패널티를 준다. 일부러 못 맞추게 한다.

코사인은 방향까지 계산하며, 텍스트 분석할 때는 코사인 유사도를 쓰라고 권장한다. 텍스트는 데이터간의 방향성이 일치하는 특징이 있다. 그래서 데이터가 뭉쳐있어야 한다. 주제를 하나로 통일해주면 안되나 하는 거다.

어떤 벡터와 방법이 효과가 좋은가?라는 것들이 난이도를 결정한다. 여기서는 OpenAI가 제공하는 벡터화하는 작업(임베딩)을 사용했다.

word2vec, LDA 에서 AI로 넘어오고 더 복잡한 방법이 계속 나오고 있다.

 

faiss 유사도 분석 pdf 자료 참조하기 (구글 공유 드라이브)

Faiss 모듈: index를 기반으로 데이터를 검색하는 모듈(dense vector)

벡터 검색은 머신 러닝(ML)을 활용하여 텍스트, 이미지 등 비정형 데이터의 의미와 컨텍스트를 캡처한 후 이를 숫자 표현으로 변환한다. 시맨틱 검색에 자주 사용되는 벡터 검색은 근사 최근접 이웃(ANN) 알고리즘을 사용하여 유사한 데이터를 찾는다. 기존 키워드 검색과 비교할 때 벡터 검색은 더 정확한 결과를 제공하고 더 빠르게 실행된다.

https://www.elastic.co/kr/what-is/vector-search

 

벡터 검색은 무엇인가요? ML로 향상되는 검색

벡터 검색은 무엇인가요? 벡터 검색은 비정형 데이터의 의미와 컨텍스트를 파악합니다. 벡터 검색을 사용하면 검색 속도가 빨라지고 결과의 정확도가 높아집니다. ...

www.elastic.co

출처: 부성순 선생님 자료

https://medium.com/@yasindusanjeewa8/dense-vectors-in-natural-language-processing-06818dff5cd7

https://www.pinecone.io/learn/series/nlp/dense-vector-embeddings-nlp/

https://hotorch.tistory.com/406

https://wikidocs.net/234013

조합을 여러개로 경우의 수대로 조합을 하다보면 norm값이 많아질 것이다. 그러면 norm 값 계산할 때 차이가 발생할 것이다.

 

02. FAISS

.custom { background-color: #008d8d; color: white; padding: 0.25em 0.5…

wikidocs.net

 

NLP(2) 워드 임베딩 1

벡터 또는 행렬의 값이 대부분 0으로 표현되는 방법ex. 원핫 벡터 (정답만 1 나머지 0)한계 : 단어의 개수가 늘어나면 벡터의 차원이 한없이 커진다. (단어 집합이 클수록 고차원 벡터가 됨), 공간

velog.io

  • 질의응답 챗봇 제작
    도식화 및 전체적인 proces보기: 텍스트자료 –> 숫자화(word embedding) ->랭체인 챗봇까지 (Lessons01~06까지 다살펴봄)

https://pythonmldaily.com/lesson/python-chatbot-langchain/intro-tools-plan-of-action

 

01 - Intro: Tools and Plan of Action | Python ML Daily

The most typical usage of AI these days are chatbots, personal assistants, or customer support agents. In this tutorial, let's build a chatbot that would answer customer's questions based on our answers from the FAQ document. Our "knowledge base" FAQ will

pythonmldaily.com

 

[8기 랭체인] VectorDB Faiss 뜯어보기 & 내가 만든 Faiss VectorDB

안녕하세요 8기 랭체인방 정정민입니다 이번에는 VectorDB에 대한 공부를 해봤습니다 코드 Faiss 뜯어보기 VectorDB와 Faiss VectorDB란 Langchain에서 사용하는 DB로 데이터의 특징값을 이용해 위 업무를 수

www.gpters.org


계속 위에 코드처럼 shape을 확인해줘야 한다.

LangChain의 embeddings 모듈에서 임베딩 쿼리 값을 하나만 사용할 때 평균값이나 최대값을 구하는 이유는, 고차원 벡터(예: 1536차원)의 복잡도를 줄이고 데이터 품질과 정밀도를 향상시키기 위함이다. 임베딩은 데이터의 의미를 압축한 벡터로, 평균값은 전체적인 경향을, 최대값은 특정 차원의 특징을 강조할 수 있어 다운스트림 작업(예: 검색, 분류 등)에서 성능에 영향을 미친다. 이러한 통계적 기법을 활용하면 임베딩 벡터를 더 의미 있게 가공할 수 있으며, 데이터의 특성과 목적에 따라 적절한 방식을 선택하는 것이 중요하다.

벡터의 분포도 시각화는 통계적인 기법을 사용하여 데이터 벡터값이 어떻게 분포되어있는지 확인할 수 있다. PCA는 머신러닝가서 배운다.

Chorma와 faiss 차이점? faiss는 처음 사용할 때 유용하다.

 

소셜데이터만 전문적으로 분석해주는 곳들 형태소분석해서 워드클라우드화시킨다. 직장인 키워드 넣어서 이 시점에서 지금 날짜에 대한 키워드 넣지않아서 옛날꺼든 다 나와버렸지만, 특정 날짜를 정해놔서 사람들이 질문하는 건수에 대한 것과 데이터 질문 추이를 연도별로 검색하고 싶다면 어떤 이슈가 생기냐면 우리가 보통 아플 때 치킨 먹지말라는 소리를 한다. 고열량이기 때문에 다이어트에 먹지 말라는건 흔히 있는 말이다.


네이버지식인 형태소분석 워드클라우드

GPT에 코드를 주면서 QA 테스트 방법을 물어본다. PM으로서 해야할 일이다. 계획해야 할 부분이다. IT가 좋은 것은 정형화가 잘되어있다. 프로젝트 매니저로서 작업을 한다고 하면 데이터를 긁어오는 것과 목표설정하고 csv로 저장하겠다고 하면 된다. 요구사항 분석 (기능, 비기능 주요사항) 해야한다.

데이터 분석가의 입장이라면 어떤 키워드가 특정주제와 관련이 있는가? 빈도가 높은 주요 명사는 무엇인가? 데이터 전처리 및 시각화 결과는 직관적인가? 한다면 데이터 전처리하고, 빈도 분석하고, 결과 저장한다. 여기까지가 일반적인 데이터 분석가일이고, 텍스트 분석 전문가로서는 형태소 분석, 데이터 정합성 점검(연관 단어 확인), 텍스트 분석(명사빈도 분석, 키워드 기반 분석, 데이터 분포 시각화), 고급 텍스트 분석 기법 (공출현, 단어 네트워크 시각화, 예를 들면 ‘배달’과 ‘가격’이 함께 자주 등장하는지 분석, 그리고 주제 모델링(LDA)), 워드클라우드 검증을 한다. 통계분석 전문가는 데이터의 신뢰성과 정확성 검증, 통계적 기법을 활용해서 데이터 사이언스쪽을 하게 된다. 패턴이나 이상치 탐색하고, 클러스터링, 피어슨 상관계수 분석 등을 한다. AI, 데이터기획전문가로서는 전략적 데이터 기획, AI 활용방안, 데이터 구조 설계, 기술 스택 선정, 팀 간 협업 및 산출물의 비즈니스 가치 극대화를 목표로 하여, 엔지니어링 파트와 다르다. 엔지니어링은 어떻게 내보내고 이런 부분이다. 데이터 구조 설계를 먼저하게 되는데 코딩을 하라는 이야기이고 코딩해야하고, 코딩하는 사람보다 더 많이 알아야 한다.

직무 주요 업무 주요 기술 / 기법 주요 산출물
데이터 분석가 - 데이터 전처리
- 빈도 분석
- 결과 저장
- 주요 명사 빈도 분석
- 키워드 추출
- 데이터 시각화 결과 직관성 점검
- 정제된 데이터
- 주요 키워드 및 빈도 결과
- 시각화 자료 (예: 그래프, 테이블)
텍스트 분석 전문가 - 형태소 분석
- 데이터 정합성 점검
- 명사 빈도 분석
- 키워드 기반 분석
- 고급 텍스트 분석
- 데이터 분포 시각화
- 공출현 분석
- 단어 네트워크 시각화
- 주제 모델링 (LDA)
- 워드클라우드 검증
- 연관 단어 결과
- 네트워크 분석 그래프
- LDA 모델 기반 주제별 키워드
- 워드클라우드 시각화
통계분석 전문가 - 데이터 신뢰성 및 정확성 검증
- 통계적 기법 활용
- 패턴 및 이상치 탐색
- 클러스터링
- 피어슨 상관계수 분석
- 통계적 데이터 해석
- 검증된 데이터
- 통계 분석 결과
- 클러스터 및 상관관계 리포트
AI/데이터 기획 전문가 - 전략적 데이터 기획
- AI 활용 방안 설계
- 데이터 구조 설계
- 기술 스택 선정
- 비즈니스 가치 극대화
- 팀 간 협업 조율
- AI 모델 적용 가능성 분석
- 기술 및 데이터 구조 최적화
- 데이터 전략 기획서
- AI 활용 방안 보고서
- 기술 스택 및 구조 설계 문서
엔지니어링 전문가 - 데이터 구조 설계
- 코딩 및 개발
- 데이터 처리 및 배포
- 데이터 처리 코드 작성
- 데이터 파이프라인 구축
- 효율적 데이터 처리 방법 설계
- 데이터 처리 코드 및 파이프라인
- 최적화된 데이터 처리 시스템

‘결과가 안좋아도 되지만 알에이지 하나를 하기 위해서 임베딩을 위해서 결과값이 안좋으니 임베딩 정확도를 높이기 위해서 방법론을 고민해봤다’라고 알기만 하면 된다. 속도와 자원만 받쳐만 준다면 기술은 그냥 하면 된다. 우리는 샅샅이 알아야 한다. 하나를 하더라도 땅굴을 파야 한다.

이렇게 보는 포지션에 따라서 시각이 다 다르다.

카운트 수에 대한 부분을 정리를 해야한다. 빈도수 sort한다음에 절반만 한다던지.


네이버 쇼핑몰 데이터 RAG

우리 자료에는 고전적인 방법들이 많다. BOW(Back of word), COW(Count of word)기반, COW는 단어간 연관성을 알 수가 없다. 어떤 단어가 중요한 단어인지, 이슈가 있는지.

그리고 그 다음 기법으로 나온 것이 DTM이다. 단위를 매트릭스(행열)로 만들어준다.

TF, DF 빈도수에 관한 것이다.

상관도 값을 기준으로 해서 값이 없는 것을 제외하고, 불필요한 값이라고 간주한다. 필요한 것만 선별하여 튜플 형태로 변환하며, 0.999999처럼 높은 상관도 값을 가진 요소들만 추출하여 의미 있는 상관 관계를 도출한다. 이 과정을 통해 데이터의 유의미한 연관성을 강조하고 분석의 정확도를 높일 수 있다.

네트워크 분석, 노드가 짧으면 짧을수록 가깝고, 이 값이 크면 클수록 거리가 가깝다. 그래서 1에 가까운 것을 연관이 높다.

파이썬의 네트워크 그래프가 속을 썩인다. 엄청 고생한다. 이번에 네트워크 그래프를 안그려도 된다. 데이터량 많아서 그림도 잘 안나온다. 연관분석할 때 네트워크 그래프를 쓸 수 있다.

행과 열값으로 다 표현이 된다.

TF는 내 문서에서 특정 단어가 등장하는 빈도를 의미하며, 해당 단어가 해당 문서 내에서 얼마나 자주 등장했는지를 나타낸다. 반면, DF는 특정 단어가 전체 문서에서 등장한 빈도를 나타내며, 단어가 얼마나 보편적인지 평가하는 척도이다. IDF는 DF의 역수를 취한 값으로, 다른 문서에는 잘 등장하지 않지만 특정 문서에 자주 등장하는 단어를 강조하는 데 사용된다. 이를 통해 특정 문서의 고유한 특징을 나타내는 중요한 단어를 식별할 수 있다.

예를 들어, 장바구니 분석에서 모든 사람이 물을 구매했다면, 물은 모든 고객에게 공통적으로 나타나므로 분석 대상으로 적합하지 않다. 이는 분석의 차별성과 유의미성을 떨어뜨리기 때문이다. 하지만, 특정 상품(예: 맥주)을 구매한 고객이 유독 한 브랜드의 물을 함께 구매한다면, 이는 분석의 가치가 생긴다. 이러한 사례는 연관 규칙 분석에서 특정 상품 간의 연관성을 확인하는 데 중요한 지표가 될 수 있다.


한국어 형태소분석을 위한 시스템 세팅

git 다운로드

https://www.codeit.kr/tutorials/43/KoNLPy-설치하기-Windows

 

KoNLPy 설치하기(Windows) | 코드잇

| {% callout(info) %} 이 튜토리얼은 Windows 사용자 대상입니다. macOS를 사용하시는 분들은 KoNLPy 설치하기(macOS)를 참고해 주세요. {% endcallout %} KoNLPy는 한국어 자연어 처리를 위한 파이썬 패키지입니다.

www.codeit.kr

 

jpype 설치