AI연구회
경남ICT협회 AI 연구 모임
AI 에이전트에서 문장 유사도 측정은 매우 중요한 역할을 수행합니다. 이는 특히 자연어 처리(NLP) 작업에서 핵심적인 기술로, 다양한 어플리케이션에서 문장 간의 유사성을 파악하여 의사결정을 지원합니다.
아래는 코사인 유사도(Cosine Similarity)와 Semantic Chunking 사용한 두 문장의 유사도 차이를 보기 위함이며, 이러한 방법은 AI Agent 구현시 데이터 분리에서 어떤 방법을 사용할지 기준이 되는 방법입니다.
코사인 유사도(Cosine Similarity)는 두 벡터 간의 유사성을 측정하는 방법 중 하나입니다. 특히 텍스트 데이터에서 문장이나 문서의 유사성을 평가할 때 많이 사용됩니다. 코사인 유사도는 두 벡터 간의 코사인 각도를 계산하여, 이들의 방향적 유사성을 수치로 표현합니다. 값이 1에 가까울수록 두 벡터의 방향성이 유사하다는 것을 의미하고, 0에 가까울수록 방향성이 다르다는 것을 나타냅니다. 아래는 코사인 유사도를 계산하는 단계별 설명입니다:
### Step 1: 텍스트 데이터 벡터화
먼저, 비교할 텍스트 데이터(문장, 문서 등)를 벡터로 변환해야 합니다. 이를 위해 텍스트를 토큰화하고, 각 토큰(단어)에 대해 빈도수를 계산하여 벡터를 생성합니다. 가장 보편적인 벡터화 방법은 TF-IDF(Term Frequency-Inverse Document Frequency)나 워드 임베딩(예: Word2Vec, GloVe)을 사용하는 것입니다.
### Step 2: 벡터의 내적 계산
두 벡터 𝐴A와 𝐵B가 있을 때, 이 벡터들의 내적(dot product)을 계산합니다. 내적은 다음과 같이 계산됩니다: 𝐴⋅𝐵=∑𝑖=1𝑛𝐴𝑖×𝐵𝑖A⋅B=∑i=1nAi×Bi 여기서 𝐴𝑖Ai와 𝐵𝑖Bi는 각각 벡터 𝐴A와 𝐵B의 i번째 요소입니다.
### Step 3: 벡터의 크기(노름) 계산
각 벡터의 크기(노름)를 계산합니다. 벡터 𝐴A의 크기는 다음과 같이 계산됩니다: ∥𝐴∥=∑𝑖=1𝑛𝐴𝑖2∥A∥=∑i=1nAi2 벡터 𝐵B에 대해서도 동일한 계산을 합니다.
### Step 4: 코사인 유사도 계산
두 벡터의 내적과 각 벡터의 크기를 사용하여 코사인 유사도를 계산합니다. 코사인 유사도는 다음 공식으로 정의됩니다: cosine similarity=𝐴⋅𝐵∥𝐴∥×∥𝐵∥cosine similarity=∥A∥×∥B∥A⋅B 이 값은 -1과 1 사이의 값을 가지며, 1에 가까울수록 두 벡터의 방향이 유사하다는 것을 의미합니다.
### Step 5: 결과 해석
계산된 코사인 유사도 값을 통해 두 텍스트 간의 유사성을 해석합니다. 값이 높을수록 텍스트 간의 내용이 유사하다고 볼 수 있습니다.
코사인 유사도는 방향성에 중점을 두기 때문에, 벡터의 크기보다는 방향이 얼마나 비슷한지를 중요시합니다. 이는 특히 문서의 길이가 다를 때 유용하며, 문서의 길이에 영향을 받지 않는 유사성 측정 방법으로 활용됩니다.
### 코사인 유사도 계산을 위한 Python code
코사인 유사도를 계산하기 위한 코드를 Python로 두 텍스트 문서 간의 코사인 유사도를 계산하기 위해 `scikit-learn` 라이브러리의 `TfidfVectorizer`를 사용하여 벡터화를 진행하고, 이후 `cosine_similarity` 함수를 사용하여 유사도를 측정하는 code로 **TfidfVectorizer** 사용한 예 입니다.
**TfidfVectorizer**: Term Frequency-Inverse Document Frequency (TF-IDF) 방식을 이용하여 텍스트 데이터를 수치적 특성 벡터로 변환합니다. TF-IDF는 문서 내의 각 단어의 중요성을 평가하는 데 유용한 가중치를 부여하는 방법으로 특정 단어가 문서 내에서 얼마나 자주 등장하는지를 나타내는 지표입니다. TF는 해당 단어의 출현 횟수를 문서의 총 단어 수로 나눈 것입니다.
- 영어 문장경우: Cosine Similarity: 0.33609692727625745- 한글 문장경우: Cosine Similarity: 0.7214092832840533# 한글 문장이 유사도가 높은 것을 알 수 있습니다. # 값이 1에 가까울수록 두 벡터의 방향성이 유사하다는 것을 의미하고, # 0에 가까울수록 방향성이 다르다는 것을 나타냅니다.
**Semantic Chunking** 은 텍스트에서 의미론적으로 응집된 단위(예: 명사구, 동사구 등)를 식별하고 추출하는 것을 목표로 합니다. 이 방법은 문장의 구조적 및 의미적 정보를 보존하려고 합니다. - 청크는 특정 규칙(예: 정규 표현식)을 사용하여 문장 내에서 의미론적으로 관련된 단어들의 그룹을 형성합니다. 이러한 그룹화는 문장의 구문적 구조를 반영하며, 문장의 의미를 이해하는 데 도움을 줄 수 있습니다.- **활용 분야**: 시맨틱 청크는 텍스트의 의미 분석, 구문 분석, 의미역 결정, 정보 추출 등에 활용됩니다. 특히 문장에서 중요한 정보를 포함하는 구(Phrase)를 찾는 데 유용합니다.- 아래는 시맨틱 청크를 사용한 코드 예 입니다.
"삼성전자는 최신 스마트폰을 출시했다.", "애플은 새로운 아이폰을 시장에 내놓았다." **두 문장에서 단순한 언어 배열을 보면 유사할 수 있으나 의미는 전혀 다른 내용을 알 수 있다** 따라서 두 문장의 유사 도는 **Cosine Similarity based on Semantic Chunks: 0.0** 유사도가 전혀 없다는 결과를 볼 수 있음.
그러면 Term Frequency-Inverse Document Frequency에서 유사도가 Cosine Similarity: 0.7214092832840533에 비해 시맨틱 유사도는 어느 정도 나올까?
아래 보시면 알겠지만 Cosine Similarity based on Semantic Chunks: 0.885807893036239로 TfidfVectorizer에 비해 유사도가 좀더 높게 나타남.
AI Agent 구축시 데이터 Chucking에 대해 검토한 내용입니다. 많은 참고와 GNICT 기업에서 AI Agent Application 개발에 조금이나마 도움이 되었으면 합니다.
기업 홍보를 위한 확실한 방법협회 홈페이지에 회사정보를 보강해 보세요.