이 글에서는 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는 사용자의 질문에 대해 더욱 정확한 답변을 생성할 수 있습니다.
실습
준비
실습용 디렉토리 생성:
bashmkdir my-cosine-similarity-projectcd my-cosine-similarity-project
예제 데이터 생성하기
먼저 예제 텍스트 파일을 만들어 보겠습니다.
프로젝트 루트에 gpt 폴더를 생성합니다.
bashmkdir 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/javamkdir -p src/main/resourcesmkdir -p src/test/javamkdir -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 파일을 생성하고 다음 코드를 추가하세요.
javapackage 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 파일을 생성하고 다음 코드를 추가하세요.
javapackage 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 filesChatGptResponse resPages = gson.fromJson(new FileReader(pageEmbeddingsPath), mapType);ChatGptResponse resInput = gson.fromJson(new FileReader(inputEmbeddingPath), mapType);// Assuming there is only one entry in input_embedding.jsondouble[] 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 프로젝트를 빌드하세요.
bashmvn clean install
빌드를 성공적으로 완료하면, target 디렉토리에 JAR 파일이 생성됩니다.
5. JAR 파일 실행:
빌드가 완료되면, 생성된 JAR 파일을 실행하여 page_embeddings.json과 input_embedding.json 파일의 코사인 유사도를 계산할 수 있습니다. 다음과 같이 JAR 파일을 실행하세요.
bashjava -jar target/my-cosine-similarity-project-1.0-SNAPSHOT.jar gpt/page_embeddings.json gpt/input_embedding.json
이제 이 코드를 사용하여 입력된 JSON 파일에 대한 코사인 유사도를 계산할 수 있습니다. 필요한 경우 코드를 수정하여 추가 기능을 구현하세요.
6. 결과:
bashgpt/test/page_embeddings.jsongpt/test/input_embedding.jsonCosine similarity between input.txt and page1.txt: 0.8437019406338282Cosine similarity between input.txt and page2.txt: 0.8227343059896893Cosine similarity between input.txt and page3.txt: 0.7883895187393262Cosine similarity between input.txt and page4.txt: 0.7232376661913258
마치며
ChatGPT 임베딩에 대해 살펴보았고, curl을 사용하여 임베딩 벡터를 얻는 방법과 Java Maven 환경에서 코사인 유사도를 구현하여 유사도 데이터를 추출해 보았습니다. 실제 시스템에서는 더 많은 페이지를 처리해야 하므로, 일괄 처리 또는 병렬 처리를 통해 효율성을 높일 수 있습니다.
원하는 경우 Elasticsearch와 같은 검색 엔진을 사용하여 임베딩 벡터를 인덱싱하고 검색 결과를 더욱 빠르게 얻을 수 있습니다. Elasticsearch는 유사성을 측정할 때 사용할 수 있는 다양한 거리 함수를 제공하며, 그 중 하나가 코사인 유사도입니다.
여러분의 프로젝트에서도 ChatGPT 임베딩을 사용하여 실용적이고 높은 성능의 자연어 처리 기능을 구현할 수 있기를 바랍니다.
참조
- Source : https://github.com/Deanly/chatgpt-embedding-similarity
- wikipedia : https://en.wikipedia.org/wiki/Embedding
- OpenAI Embeddings API: https://beta.openai.com/docs/api-reference/embeddings
- Open 기술 서적 : 딥 러닝을 이용한 자연어 처리 입문
- ChatGPT-3 논문 : Language Models are Few-Shot Learners
- ChatGPT-4 자료: GPT-3 와 GPT-4 의 차이점
