이 κΈ€μ—μ„œλŠ” Java 와 curl 을 μ‚¬μš©ν•˜μ—¬ ChatGPT μž„λ² λ”©(Embedding)을 μ μš©ν•˜λŠ” 방법에 λŒ€ν•œ μ‹€μš©μ μΈ κ°€μ΄λ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μžμ—°μ–΄ μ²˜λ¦¬μ™€ μ»΄ν“¨νŒ… λΉ„μš© μ ˆκ°μ— 도움이 λ˜λŠ” μž„λ² λ”© κΈ°μˆ μ„ μ‚΄νŽ΄λ³΄κ³ , OpenAI의 GPT μ•„ν‚€ν…μ²˜ 기반의 ChatGPTλ₯Ό ν™œμš©ν•˜μ—¬ ν…μŠ€νŠΈ μž„λ² λ”©μ„ μƒμ„±ν•˜λŠ” 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.


κ°œμš”

μž„λ² λ”©(Embedding) μ΄λž€?

μž„λ² λ”©(embedding)μ΄λž€, μžμ—°μ–΄ 처리, 컴퓨터 λΉ„μ „, μΆ”μ²œ μ‹œμŠ€ν…œ λ“± λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ μ‚¬μš©λ˜λŠ” κΈ°λ²•μœΌλ‘œ, κ³ μ°¨μ›μ˜ 데이터λ₯Ό μ €μ°¨μ›μ˜ 곡간에 ν‘œν˜„ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ ꡬ쑰와 관계λ₯Ό λ³΄μ‘΄ν•˜λ©΄μ„œ μ»΄ν“¨νŒ… λΉ„μš©μ„ 쀄이고 νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

μžμ—°μ–΄ μ²˜λ¦¬μ—μ„œ μž„λ² λ”©μ€ 주둜 단어, λ¬Έμž₯, λ¬Έμ„œ λ“± ν…μŠ€νŠΈ 데이터λ₯Ό 벑터 ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ μ˜λ―Έν•©λ‹ˆλ‹€. ν…μŠ€νŠΈ 데이터λ₯Ό λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λ©΄, κΈ°κ³„ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜μ—¬ λ‹€μ–‘ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 감성 뢄석, 기계 λ²ˆμ—­, ν…μŠ€νŠΈ λΆ„λ₯˜, 정보 검색 λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž„λ² λ”© κ³Όμ •μ—μ„œ μ£Όμš” λͺ©ν‘œλŠ” μœ μ‚¬ν•œ 의미λ₯Ό 가진 λ‹¨μ–΄λ‚˜ λ¬Έμž₯이 벑터 κ³΅κ°„μ—μ„œ κ°€κΉŒμš΄ μœ„μΉ˜μ— λ§€ν•‘λ˜λ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 벑터 κ°„μ˜ κ±°λ¦¬λ‚˜ 코사인 μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜μ—¬ ν…μŠ€νŠΈ κ°„μ˜ μœ μ‚¬μ„±μ„ μΈ‘μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν…μŠ€νŠΈ μž„λ² λ”©μ„ μƒμ„±ν•˜λŠ” λ°©λ²•μ—λŠ” Word2Vec, GloVe, FastText, BERT, GPT λ“± λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ•Œκ³ λ¦¬μ¦˜λ“€μ€ 각각 λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ ν…μŠ€νŠΈ 데이터λ₯Ό ν•™μŠ΅ν•˜κ³  벑터 곡간에 ν‘œν˜„ν•©λ‹ˆλ‹€. 졜근의 νŠΈλžœλ“œλŠ” Transformer 기반의 λͺ¨λΈμΈ BERT와 GPTλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ μž„λ² λ”©μ„ μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이듀은 특히 λ¬Έλ§₯ 정보λ₯Ό ν¬ν•¨ν•˜λŠ” μž„λ² λ”©μ„ 생성할 수 μžˆλŠ” κ²ƒμœΌλ‘œ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€.

ChatGPT 에 μ‚¬μš©ν•œ μž„λ² λ”© μ•Œκ³ λ¦¬μ¦˜μ€?

ChatGPTλŠ” OpenAI의 GPT(Generative Pre-trained Transformer) μ•„ν‚€ν…μ²˜λ₯Ό 기반으둜 ν•©λ‹ˆλ‹€. GPTλŠ” Transformer λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ μž„λ² λ”©μ„ μƒμ„±ν•©λ‹ˆλ‹€. TransformerλŠ” Vaswani et al.에 μ˜ν•΄ μ œμ•ˆλœ μ•„ν‚€ν…μ²˜λ‘œ, μžμ—°μ–΄ μ²˜λ¦¬μ—μ„œ 높은 μ„±λŠ₯을 보여주고 μžˆμŠ΅λ‹ˆλ‹€.

GPTλŠ” 비지도 ν•™μŠ΅μ„ μ‚¬μš©ν•˜μ—¬ λŒ€κ·œλͺ¨ ν…μŠ€νŠΈ λ°μ΄ν„°μ…‹μ—μ„œ 사전 ν•™μŠ΅λœ μ–Έμ–΄ λͺ¨λΈμž…λ‹ˆλ‹€. 이 사전 ν•™μŠ΅ κ³Όμ •μ—μ„œ GPTλŠ” λ¬Έλ§₯ 정보λ₯Ό ν¬μ°©ν•˜κ³ , 이λ₯Ό μž„λ² λ”©μ— ν¬ν•¨μ‹œν‚€λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 사전 ν•™μŠ΅ 이후, GPTλŠ” 더 μž‘μ€ 데이터셋을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • μž‘μ—…μ— 맞게 λ―Έμ„Έ μ‘°μ •(fine-tuning)될 수 μžˆμŠ΅λ‹ˆλ‹€.

GPTμ—μ„œμ˜ μž„λ² λ”©μ€ μž…λ ₯ ν…μŠ€νŠΈμ˜ 각 λ‹¨μ–΄λ‚˜ 토큰을 κ³ μ •λœ 길이의 λ²‘ν„°λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μƒμ„±λœ μž„λ² λ”©μ€ Transformer μ•„ν‚€ν…μ²˜μ˜ 측을 κ±°μΉ˜λ©΄μ„œ 각 토큰에 λŒ€ν•œ λ¬Έλ§₯ 정보λ₯Ό ν¬ν•¨ν•˜κ²Œ λ©λ‹ˆλ‹€. 결과적으둜, λ¬Έμž₯μ΄λ‚˜ λ¬Έμ„œ μ „μ²΄μ˜ μž„λ² λ”©μ΄ μƒμ„±λ˜λ©°, 이λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ μžμ—°μ–΄ 처리 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ChatGPT의 경우, GPT-3 및 κ·Έ 이전 버전에 λΉ„ν•΄ 더 큰 λͺ¨λΈ(GPT-4)을 μ‚¬μš©ν•˜μ—¬ 더 μ •κ΅ν•œ ν…μŠ€νŠΈ μž„λ² λ”©κ³Ό 더 λ‚˜μ€ μžμ—°μ–΄ 이해 λŠ₯λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ChatGPTλŠ” μ‚¬μš©μžμ˜ μ§ˆλ¬Έμ— λŒ€ν•΄ λ”μš± μ •ν™•ν•œ 닡변을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.


μ‹€μŠ΅

μ€€λΉ„

μ‹€μŠ΅μš© 디렉토리 생성:

bash
mkdir my-cosine-similarity-project
cd my-cosine-similarity-project

예제 데이터 μƒμ„±ν•˜κΈ°

λ¨Όμ € 예제 ν…μŠ€νŠΈ νŒŒμΌμ„ λ§Œλ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— gpt 폴더λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

bash
mkdir gpt

μ•„λž˜ ν…μŠ€νŠΈλ₯Ό 각각 page1.txt, page2.txt, page3.txt, page4.txt, input.txt λΌλŠ” 파일둜 μ €μž₯ν•΄μ£Όμ„Έμš”.

page1.txt:

OpenAIλŠ” 2015년에 μ„€λ¦½λœ 인곡지λŠ₯ 연ꡬ 및 μ‘μš© ν”„λ‘œκ·Έλž¨ 개발 νšŒμ‚¬λ‘œ, ν˜„μž¬λŠ” GPT-3, DALL-E, Codex λ“± λ‹€μ–‘ν•œ 인곡지λŠ₯ λͺ¨λΈκ³Ό μ‘μš© ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜μ—¬ 세계적인 기술 κΈ°μ—… 쀑 ν•˜λ‚˜λ‘œ 자리 μž‘μ•˜μŠ΅λ‹ˆλ‹€. OpenAI의 μ£Όμš” 연ꡬ μ£Όμ œλŠ” μžμ—°μ–΄ 처리, 컴퓨터 λΉ„μ „, κ°•ν™” ν•™μŠ΅ λ“±μž…λ‹ˆλ‹€. 특히, μžμ—°μ–΄ 처리 λΆ„μ•Όμ—μ„œλŠ” GPT-3 λͺ¨λΈμ„ κ°œλ°œν•˜μ—¬ μ΄μ „μ—λŠ” λΆˆκ°€λŠ₯ν–ˆλ˜ μžμ—°μ–΄ 생성 및 이해 λΆ„μ•Όμ—μ„œ 큰 λ°œμ „μ„ μ΄λ£¨μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, DALL-E와 같은 μƒˆλ‘œμš΄ λͺ¨λΈλ„ κ°œλ°œν•˜μ—¬ 인곡지λŠ₯ λΆ„μ•Όμ˜ 경계λ₯Ό λ„“ν˜”μŠ΅λ‹ˆλ‹€. OpenAIλŠ” 인곡지λŠ₯ 연ꡬλ₯Ό 톡해 μΈκ°„μ˜ 삢을 κ°œμ„ ν•˜κ³  λ°œμ „μ‹œν‚€λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ λ‹€μ–‘ν•œ μ‚¬νšŒμ  문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 연ꡬ도 μ§„ν–‰ν•˜κ³  있으며, 예츑 κ°€λŠ₯μ„±, μ‹ λ’°μ„±, 곡정성 등을 κ°•μ‘°ν•˜μ—¬ 인곡지λŠ₯ 기술의 λ°œμ „μ— λŒ€ν•œ 윀리적인 고민도 ν•¨κ»˜ 이루어지고 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, OpenAIλŠ” 인곡지λŠ₯ λΆ„μ•Όμ—μ„œ μ „ μ„Έκ³„μ μœΌλ‘œ 큰 영ν–₯λ ₯을 가진 κΈ°μ—… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. μ•žμœΌλ‘œ OpenAI의 연ꡬ와 기술 κ°œλ°œμ„ 톡해 λ”μš± λ°œμ „λœ 인곡지λŠ₯ 기술이 λ§Œλ“€μ–΄μ§ˆ κ²ƒμœΌλ‘œ κΈ°λŒ€λ©λ‹ˆλ‹€.

page2.txt:

λ¨Έμ‹ λŸ¬λ‹(Machine Learning)은 인곡지λŠ₯의 ν•œ λΆ„μ•Όλ‘œ, 컴퓨터가 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬ 슀슀둜 ν•™μŠ΅ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜κ³Ό κΈ°μˆ μ„ μ—°κ΅¬ν•˜λŠ” λΆ„μ•Όμž…λ‹ˆλ‹€. 데이터λ₯Ό 기반으둜 컴퓨터가 슀슀둜 νŒ¨ν„΄μ„ ν•™μŠ΅ν•˜κ³  μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 λ¨Έμ‹ λŸ¬λ‹μ˜ μ£Όμš” λͺ©ν‘œμž…λ‹ˆλ‹€. λ¨Έμ‹ λŸ¬λ‹μ€ μ§€λ„ν•™μŠ΅, λΉ„μ§€λ„ν•™μŠ΅, κ°•ν™”ν•™μŠ΅ λ“±μ˜ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€. μ§€λ„ν•™μŠ΅μ€ μž…λ ₯κ³Ό 좜λ ₯ 데이터λ₯Ό μ΄μš©ν•˜μ—¬ ν•™μŠ΅ν•˜λŠ” 방법이며, 예λ₯Ό λ“€μ–΄ 이미지 λΆ„λ₯˜λ‚˜ μŒμ„± 인식 λ“±μ˜ λΆ„μ•Όμ—μ„œ ν™œμš©λ©λ‹ˆλ‹€. λΉ„μ§€λ„ν•™μŠ΅μ€ μž…λ ₯ λ°μ΄ν„°λ§ŒμœΌλ‘œ ν•™μŠ΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ, 데이터 ν΄λŸ¬μŠ€ν„°λ§μ΄λ‚˜ 차원 μΆ•μ†Œ 등에 ν™œμš©λ©λ‹ˆλ‹€. κ°•ν™”ν•™μŠ΅μ€ μ—μ΄μ „νŠΈκ°€ 행동을 톡해 보상을 μ–»μœΌλ©° 슀슀둜 ν•™μŠ΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ, κ²Œμž„ AIλ‚˜ λ‘œλ΄‡ μ œμ–΄ 등에 ν™œμš©λ©λ‹ˆλ‹€. λ¨Έμ‹ λŸ¬λ‹μ€ λŒ€κ·œλͺ¨ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  λΆ„μ„ν•˜λŠ” 데에 큰 도움을 μ£Όλ©°, μƒˆλ‘œμš΄ λΆ„μ•Όμ—μ„œμ˜ μ‘μš© κ°€λŠ₯성도 κ³„μ†ν•΄μ„œ ν™•μž₯되고 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 의료, 금육, 농업 λ“± λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ λ¨Έμ‹ λŸ¬λ‹μ„ ν™œμš©ν•˜μ—¬ 데이터 뢄석과 μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λ¨Έμ‹ λŸ¬λ‹μ€ 인곡지λŠ₯ λΆ„μ•Όμ—μ„œ μ€‘μš”ν•œ 기술둜 자리 작고 있으며, μ•žμœΌλ‘œ λ”μš± λ°œμ „λœ λ¨Έμ‹ λŸ¬λ‹ κΈ°μˆ μ„ 톡해 μƒˆλ‘œμš΄ ν˜μ‹ κ³Ό λ°œμ „μ΄ μ΄λ£¨μ–΄μ§ˆ κ²ƒμœΌλ‘œ κΈ°λŒ€λ©λ‹ˆλ‹€.

page3.txt:

크리에이터듀은 λ‹€μ–‘ν•œ μ½˜ν…μΈ λ₯Ό μ œμž‘ν•˜μ—¬ 온라인으둜 λ°°ν¬ν•˜κ³  있으며, 이λ₯Ό 톡해 μˆ˜μ΅μ„ μ°½μΆœν•˜λŠ” κ²½μš°λ„ λ§ŽμŠ΅λ‹ˆλ‹€. 특히, μœ νŠœλΈŒμ™€ 같은 λ™μ˜μƒ ν”Œλž«νΌμ—μ„œλŠ” λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œλ™ν•˜λŠ” 크리에이터듀이 많이 ν™œλ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 크리에이터듀은 μžμ‹ λ§Œμ˜ μŠ€νƒ€μΌκ³Ό 컨텐츠λ₯Ό μ œμž‘ν•˜λ©°, 이λ₯Ό 톡해 λ§Žμ€ νŒ¬μ„ λͺ¨μœΌκ³  μˆ˜μ΅μ„ μ°½μΆœν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν¬λ¦¬μ—μ΄ν„°λ“€μ˜ μ½˜ν…μΈ λŠ” 유튜브 λ“±μ˜ ν”Œλž«νΌμ—μ„œ λ§Žμ€ μ‹œμ²­μžλ“€μ—κ²Œ λ…ΈμΆœλ˜κ³ , κ΄‘κ³  수읡과 ν›„μ›κΈˆ 등을 톡해 μˆ˜μ΅μ„ μ°½μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 크리에이터듀은 νŒ¬λ“€κ³Όμ˜ μ†Œν†΅μ„ 톡해 μžμ‹ μ˜ 인기λ₯Ό 높이고, λ”μš± λ§Žμ€ μ‚¬λžŒλ“€μ΄ μžμ‹ μ˜ μ½˜ν…μΈ λ₯Ό 보게 되며, 이λ₯Ό 톡해 더 λ§Žμ€ μˆ˜μ΅μ„ μ°½μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 크리에이터듀은 주기적으둜 μ½˜ν…μΈ λ₯Ό μ—…λ°μ΄νŠΈν•˜κ³ , νŒ¬λ“€κ³Όμ˜ μƒν˜Έμž‘μš©μ„ μ€‘μš”μ‹œν•˜μ—¬ μ½˜ν…μΈ λ₯Ό κ°œμ„ ν•΄ λ‚˜κ°€κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 크리에이터듀은 μžμ‹ λ§Œμ˜ 색깔과 μ°½μ˜μ„±μ„ λ°œνœ˜ν•˜μ—¬ λ‹€μ–‘ν•œ μ½˜ν…μΈ λ₯Ό μ œμž‘ν•˜κ³ , 이λ₯Ό 톡해 λ§Žμ€ νŒ¬λ“€κ³Ό μˆ˜μ΅μ„ μ°½μΆœν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλ„ 크리에이터듀은 λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œλ™ν•˜μ—¬ λ”μš± λ§Žμ€ μ‚¬λžŒλ“€μ˜ μ‚¬λž‘μ„ λ°›κ³ , μƒˆλ‘œμš΄ μ½˜ν…μΈ μ™€ μ°½μž‘λ¬Όμ„ μ œμž‘ν•  κ²ƒμœΌλ‘œ κΈ°λŒ€λ©λ‹ˆλ‹€.

page4.txt:

λŒ€ν•œλ―Όκ΅­ μ „μŸκ³Ό μ–‘μ•ˆμ „μŸμ€ λͺ¨λ‘ ꡰ사적 좩돌이 μΌμ–΄λ‚œ 사둀 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 두 μ „μŸμ€ 냉전 μ‹œλŒ€μ— λ°œλ°œν•˜μ—¬ κ΅­μ œμ‚¬νšŒμ˜ κ°œμž…μ΄ μžˆμ—ˆκ³ , μ „μŸμ΄ μ’…μ‹λœ 이후에도 λ‚¨λΆν•œ κ°„μ˜ κΈ΄μž₯상황은 μ§€μ†λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 두 μ „μŸ λͺ¨λ‘ 인λͺ… ν”Όν•΄κ°€ λ§‰λŒ€ν•˜κ²Œ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. λŒ€ν•œλ―Όκ΅­ μ „μŸμ€ μ „μŸ κΈ°κ°„ 쀑 36만 λͺ… μ΄μƒμ˜ ꡰ인과 민간인이 μ‚¬λ§ν•˜μ˜€μœΌλ©°, μ–‘μ•ˆμ „μŸμ—μ„œλŠ” 30만 λͺ… μ΄μƒμ˜ 인λͺ… ν”Όν•΄κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. 두 μ „μŸμ€ κ΅­κ°€ μ•ˆλ³΄μ™€ 톡일 문제 λ“± λ‹€μ–‘ν•œ λ¬Έμ œμ— λŒ€ν•œ λŒ€λ¦½μ΄ 배경이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λŒ€ν•œλ―Όκ΅­ μ „μŸμ€ λΆν•œμ˜ 침곡으둜 λ°œλ°œν•˜μ˜€μœΌλ©°, μ–‘μ•ˆμ „μŸμ€ λ‚¨λΆν•œμ˜ μ •μΉ˜μ  κ°ˆλ“±κ³Ό ꡰ사적 λŒ€μΉ˜λ‘œ λ°œλ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ˜ν•œ, κ΅­μ œμ‚¬νšŒμ˜ κ°œμž…μ΄ μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. λŒ€ν•œλ―Όκ΅­ μ „μŸμ—μ„œλŠ” λ―Έκ΅°κ³Ό μœ μ—”κ΅°μ˜ μ°Έμ „μœΌλ‘œ μ „μŸ 상황이 μ’…μ‹λ˜μ—ˆμœΌλ©°, μ–‘μ•ˆμ „μŸμ—μ„œλŠ” 쀑ꡭ과 μœ μ—”κ΅°μ˜ μ°Έμ „μœΌλ‘œ μ „μŸ 상황이 μ’…μ‹λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 두 μ „μŸ λͺ¨λ‘ 이후에도 λ‚¨λΆν•œ κ°„μ˜ κΈ΄μž₯ 상황은 μ§€μ†λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν•œλ―Όκ΅­ μ „μŸ 이후 λ‚¨λΆν•œμ€ 1953년에 μ •μ „ ν˜‘μ •μ„ μ²΄κ²°ν•˜μ˜€μœΌλ©°, μ–‘μ•ˆμ „μŸ 이후에도 λΆν•œκ³Ό λ‚¨ν•œ κ°„μ˜ κΈ΄μž₯이 μ§€μ†λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λŒ€ν•œλ―Όκ΅­ μ „μŸκ³Ό μ–‘μ•ˆμ „μŸμ€ μ„œλ‘œ λΉ„μŠ·ν•œ 면이 λ§ŽμŠ΅λ‹ˆλ‹€. 두 μ „μŸ λͺ¨λ‘ ꡰ사적 μΆ©λŒμ—μ„œ λ°œμƒν•˜μ˜€μœΌλ©°, κ΅­μ œμ‚¬νšŒμ˜ κ°œμž…μ΄ μžˆμ—ˆκ³ , 인λͺ… ν”Όν•΄κ°€ λ§‰λŒ€ν•˜κ²Œ λ°œμƒν•˜μ˜€μœΌλ©°, λ‚¨λΆν•œ κ°„μ˜ κΈ΄μž₯ 상황은 μ§€μ†λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

input.txt:

ChatGPT Embedding은 GPT λͺ¨λΈμ˜ μž„λ² λ”© κΈ°μˆ μ„ μ΄μš©ν•˜μ—¬, ν…μŠ€νŠΈ 데이터λ₯Ό 벑터화할 수 μžˆλŠ” κΈ°μˆ μž…λ‹ˆλ‹€. 이λ₯Ό μ΄μš©ν•˜λ©΄ ν…μŠ€νŠΈ 데이터λ₯Ό 숫자 λ°μ΄ν„°λ‘œ λ³€ν™˜ν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄μ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해, ChatGPT Embedding κΈ°μˆ μ„ ν™œμš©ν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄μ— μ–΄μ‹œμŠ€ν„΄μŠ€ κΈ°λŠ₯을 λ„μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ μž…λ ₯ν•œ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변을 μ œκ³΅ν•˜κ±°λ‚˜, νŠΉμ • μ£Όμ œμ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” λ“±μ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ChatGPT Embedding은 λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œμš©λ˜κ³  있으며, λŒ€ν‘œμ μœΌλ‘œ μžμ—°μ–΄ 처리, 챗봇 개발, 검색 엔진 λ“±μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€. λ˜ν•œ 이λ₯Ό ν™œμš©ν•˜μ—¬ 보닀 μ •ν™•ν•˜κ³  μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨, μ‚¬μš©μžλ“€μ˜ λ§Œμ‘±λ„μ™€ νŽΈμ˜μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, ChatGPT Embedding κΈ°μˆ μ€ 우리의 μ†Œν”„νŠΈμ›¨μ–΄μ— μ μš©ν•˜μ—¬ λ”μš± 직관적이고 νŽΈλ¦¬ν•œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ”λ° 큰 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

μ €μž₯ν• λ•Œ μ—”ν„°λ₯Ό ν¬ν•¨ν•˜μ§€ λ§μ•„μ£Όμ„Έμš”. λ‹€μŒ μ§„ν–‰λ˜λŠ” curl μ˜ˆμ œμ—μ„œλŠ” escape ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예제 ν…μŠ€νŠΈλ“€μ€ ChatGPT μ—μ„œ 발췌 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ChatGPT μž„λ² λ”© 벑터 μƒμ„±ν•˜κΈ°

λ‹€μŒμœΌλ‘œ, μ΄λŸ¬ν•œ νŽ˜μ΄μ§€ ν…μŠ€νŠΈ νŒŒμΌλ“€κ³Ό μž…λ ₯ ν…μŠ€νŠΈ νŒŒμΌμ„ Embeddings APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λ €λ©΄ μ•„λž˜μ™€ 같은 curl λͺ…령을 μ‹€ν–‰ν•΄μ£Όμ„Έμš”.

bash
# νŽ˜μ΄μ§€ μž„λ² λ”© 생성
curl -X POST "https://api.openai.com/v1/embeddings"
-H "Content-Type: application/json"
-H "Authorization: Bearer YOUR_API_KEY"
-d '{
"input": ["'"$(cat page1.txt)"'", "'"$(cat page2.txt)"'", "'"$(cat page3.txt)"'", "'"$(cat page4.txt)"'"],
"model": "text-embedding-ada-002"
}' > page_embeddings.json
# μž…λ ₯ ν…μŠ€νŠΈ μž„λ² λ”© 생성
curl -X POST "https://api.openai.com/v1/embeddings"
-H "Content-Type: application/json"
-H "Authorization: Bearer YOUR_API_KEY"
-d '{
"input": ["'"$(cat input.txt)"'"],
"model": "text-embedding-ada-002"
}' > input_embedding.json

이제 page_embeddings.jsonκ³Ό input_embedding.json νŒŒμΌμ— 각각 νŽ˜μ΄μ§€ 및 μž…λ ₯ ν…μŠ€νŠΈμ˜ μž„λ² λ”© 벑터가 μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ 코사인 μœ μ‚¬λ„μ™€ 같은 λ°©λ²•μœΌλ‘œ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜κ³ , κ²°κ³Όλ₯Ό μ •λ ¬ν•˜μ—¬ 검색 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

/gpt/input.txt
/gpt/input_embedding.json
/gpt/page1.txt
/gpt/page2.txt
/gpt/page3.txt
/gpt/page4.txt
/gpt/page_embedding.json

코사인 μœ μ‚¬λ„ μΈ‘μ •ν•˜κΈ°

Java Maven ν”„λ‘œμ νŠΈλ₯Ό μž‘μ„±ν•˜μ—¬ μΈ‘μ •ν•©λ‹ˆλ‹€. μ‹œμž‘ν•˜λ €λ©΄ λ‹€μŒ 단계λ₯Ό λ”°λ₯΄μ„Έμš”.

1. Maven ν”„λ‘œμ νŠΈ ꡬ쑰 생성:

mkdir -p src/main/java
mkdir -p src/main/resources
mkdir -p src/test/java
mkdir -p src/test/resources

2. pom.xml 파일 생성:

ν”„λ‘œμ νŠΈ λ””λ ‰ν† λ¦¬μ˜ λ£¨νŠΈμ— pom.xml νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€ν•˜μ„Έμš”.

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-cosine-similarity-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- Gson: Java JSON library -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<!-- Apache Commons Math: for linear algebra -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.cosinesimilarity.CosineSimilarityApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.cosinesimilarity.CosineSimilarityApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

3. μ†ŒμŠ€ μ½”λ“œ μΆ”κ°€:

μœ„μ—μ„œ μ œκ³΅ν•œ CosineSimilarityCalculator 클래슀λ₯Ό src/main/java 디렉토리에 μ μ ˆν•œ νŒ¨ν‚€μ§€ ꡬ쑰에 맞게 μΆ”κ°€ν•˜μ„Έμš”. 예λ₯Ό λ“€μ–΄, νŒ¨ν‚€μ§€ 이름이 com.example.cosinesimilarity라면, λ‹€μŒκ³Ό 같은 디렉토리 ꡬ쑰λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

src/main/java/com/example/cosinesimilarity/CosineSimilarityCalculator.java νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ„Έμš”.

java
package com.example.cosinesimilarity;
import org.apache.commons.math3.linear.ArrayRealVector;
import org.apache.commons.math3.linear.RealVector;
public class CosineSimilarityCalculator {
/**
* Create a RealVector from a double array.
*
* @param array the input double array
* @return a RealVector representing the input array
*/
public static RealVector createRealVector(double[] array) {
return new ArrayRealVector(array);
}
/**
* Compute the cosine similarity between two RealVectors.
*
* @param vector1 the first RealVector
* @param vector2 the second RealVector
* @return the cosine similarity between the two input RealVectors
*/
public double computeCosineSimilarity(RealVector vector1, RealVector vector2) {
double dotProduct = vector1.dotProduct(vector2);
double normA = vector1.getNorm();
double normB = vector2.getNorm();
if (normA == 0 || normB == 0) {
return 0;
} else {
return dotProduct / (normA * normB);
}
}
}

src/main/java/com/example/cosinesimilarity/CosineSimilarityApp.java νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ„Έμš”.

java
package com.example.cosinesimilarity;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.apache.commons.math3.linear.RealVector;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.List;
public class CosineSimilarityApp {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: java -jar my-cosine-similarity-project-1.0-SNAPSHOT.jar <path_to_page_embeddings.json> <path_to_input_embedding.json>");
return;
}
String pageEmbeddingsPath = args[0];
String inputEmbeddingPath = args[1];
System.out.println(pageEmbeddingsPath);
System.out.println(inputEmbeddingPath);
Gson gson = new Gson();
Type mapType = new TypeToken<ChatGptResponse>() {}.getType();
try {
// Read page_embeddings.json and input_embedding.json files
ChatGptResponse resPages = gson.fromJson(new FileReader(pageEmbeddingsPath), mapType);
ChatGptResponse resInput = gson.fromJson(new FileReader(inputEmbeddingPath), mapType);
// Assuming there is only one entry in input_embedding.json
double[] inputEmbeddings = resInput.data.get(0).embedding;
RealVector inputVector = CosineSimilarityCalculator.createRealVector(inputEmbeddings);
CosineSimilarityCalculator calculator = new CosineSimilarityCalculator();
for (EmbeddingData pageEmbeddingData : resPages.data) {
RealVector pageVector = CosineSimilarityCalculator.createRealVector(pageEmbeddingData.embedding);
double similarity = calculator.computeCosineSimilarity(inputVector, pageVector);
System.out.println("Cosine similarity between input.txt and page" + (pageEmbeddingData.index + 1) + ".txt: " + similarity);
}
} catch (IOException e) {
System.out.println("Error reading input files: " + e.getMessage());
}
}
static class ChatGptResponse {
String object;
List<EmbeddingData> data;
String model;
}
static class EmbeddingData {
String object;
Long index;
double[] embedding;
}
}

4. Maven λΉŒλ“œ:

ν”„λ‘œμ νŠΈ λ””λ ‰ν† λ¦¬μ—μ„œ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ—¬ Maven ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•˜μ„Έμš”.

bash
mvn clean install

λΉŒλ“œλ₯Ό μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜λ©΄, target 디렉토리에 JAR 파일이 μƒμ„±λ©λ‹ˆλ‹€.

5. JAR 파일 μ‹€ν–‰:

λΉŒλ“œκ°€ μ™„λ£Œλ˜λ©΄, μƒμ„±λœ JAR νŒŒμΌμ„ μ‹€ν–‰ν•˜μ—¬ page_embeddings.jsonκ³Ό input_embedding.json 파일의 코사인 μœ μ‚¬λ„λ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 JAR νŒŒμΌμ„ μ‹€ν–‰ν•˜μ„Έμš”.

bash
java -jar target/my-cosine-similarity-project-1.0-SNAPSHOT.jar gpt/page_embeddings.json gpt/input_embedding.json

이제 이 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μž…λ ₯된 JSON νŒŒμΌμ— λŒ€ν•œ 코사인 μœ μ‚¬λ„λ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ 경우 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ—¬ μΆ”κ°€ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ„Έμš”.

6. κ²°κ³Ό:

bash
gpt/test/page_embeddings.json
gpt/test/input_embedding.json
Cosine similarity between input.txt and page1.txt: 0.8437019406338282
Cosine similarity between input.txt and page2.txt: 0.8227343059896893
Cosine similarity between input.txt and page3.txt: 0.7883895187393262
Cosine similarity between input.txt and page4.txt: 0.7232376661913258

마치며

ChatGPT μž„λ² λ”©μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜κ³ , curl을 μ‚¬μš©ν•˜μ—¬ μž„λ² λ”© 벑터λ₯Ό μ–»λŠ” 방법과 Java Maven ν™˜κ²½μ—μ„œ 코사인 μœ μ‚¬λ„λ₯Ό κ΅¬ν˜„ν•˜μ—¬ μœ μ‚¬λ„ 데이터λ₯Ό μΆ”μΆœν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ‹€μ œ μ‹œμŠ€ν…œμ—μ„œλŠ” 더 λ§Žμ€ νŽ˜μ΄μ§€λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ, 일괄 처리 λ˜λŠ” 병렬 처리λ₯Ό 톡해 νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

μ›ν•˜λŠ” 경우 Elasticsearch와 같은 검색 엔진을 μ‚¬μš©ν•˜μ—¬ μž„λ² λ”© 벑터λ₯Ό μΈλ±μ‹±ν•˜κ³  검색 κ²°κ³Όλ₯Ό λ”μš± λΉ λ₯΄κ²Œ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. ElasticsearchλŠ” μœ μ‚¬μ„±μ„ μΈ‘μ •ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 거리 ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜λ©°, κ·Έ 쀑 ν•˜λ‚˜κ°€ 코사인 μœ μ‚¬λ„μž…λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„μ˜ ν”„λ‘œμ νŠΈμ—μ„œλ„ ChatGPT μž„λ² λ”©μ„ μ‚¬μš©ν•˜μ—¬ μ‹€μš©μ μ΄κ³  높은 μ„±λŠ₯의 μžμ—°μ–΄ 처리 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 있기λ₯Ό λ°”λžλ‹ˆλ‹€.


μ°Έμ‘°

Feed Β·Sitemap
Copyright Β© 2024 Dean Lee. All rights reserved.
Powered by Urara