오늘은 OpenAI Cookbook 에 있는 Embeddings 섹션의 두번째 페이지를 공부해 보겠습니다.
Text comparison exampls에 있는 예제들은 대충 한번 둘러 봤습니다.
여기에는 get_embedding() 관련 에제 두개가 나옵니다.
아주 기초적인 건데요. 이미 두루었기도 하구요.
여기 나오니까 잠깐 살펴보고 가겠습니다.
첫번째 소스 입니다.
import openai
embedding = openai.Embedding.create(
input="Your text goes here", model="text-embedding-ada-002"
)["data"][0]["embedding"]
len(embedding)
이렇게 하면 embedding에는 prompt ("Your text goes here") 에 대한 openai api의 response가 담기게 됩니다.
이것은 JSON 형식으로 되어 있습니다. 그 중에 data 항목의 첫번째에 있는 embedding이란 항목에 있는 값만 embedding에 담기게 됩니다.
이것을 그대로 출력해 보겠습니다.
import openai
def open_file(filepath):
with open(filepath, 'r', encoding='utf-8') as infile:
return infile.read()
openai.api_key = open_file('openaiapikey.txt')
embedding = openai.Embedding.create(
input="Your text goes here", model="text-embedding-ada-002"
)["data"][0]["embedding"]
len(embedding)
print (len(embedding))
print (embedding)
확인을 위해서 소스코드를 약간 바꾸었습니다.
openai api key를 제공하는 부분을 넣었구요.
command 창에서 결과를 확인할 수 있도록 print 문을 넣었습니다.
파이썬 주피터 툴을 쓰시면 print 문 없이 결과를 확인 할 수 있습니다.
결과는 이렇습니다.
embedding의 length는 1536 이고 그 값은 아래 나온 숫자들입니다.
그럼 전체 JSON 형식의 response를 확인하기 위해 ["data"][0]["embedding"] 부분을 빼 보겠습니다.
import openai
def open_file(filepath):
with open(filepath, 'r', encoding='utf-8') as infile:
return infile.read()
openai.api_key = open_file('openaiapikey.txt')
embedding = openai.Embedding.create(
input="Your text goes here", model="text-embedding-ada-002")
print (embedding)
그 결과는 아래와 같습니다.
["data"][0]["embedding"] <- 이 부분이 하는 일은 data의 첫번째 embedding 값들만 받으라는 얘기입니다.
참고로 이 response의 끝부분은 이렇습니다.
이 response의 data에는 embedding 값만이 아니라 index, object 정보도 있습니다.
그리고 data 이외의 정보들로는 사용한 모델, object 타입 usage 안에는 토큰 정보가 있습니다.
(참고로 이 모델과 토큰에 따라 api 사용료가 달라집니다.)
그러니까 이 ["data"][0]["embedding"] 부분이 하는 일은 저 response 중에 data에 있는 embedding 값만 받고 싶을 때 사용할 수 있습니다.
그 다음 예제는 아래와 같습니다.
import openai
from tenacity import retry, wait_random_exponential, stop_after_attempt
@retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6))
def get_embedding(text: str, model="text-embedding-ada-002") -> list[float]:
return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"]
embedding = get_embedding("Your text goes here", model="text-embedding-ada-002")
print(len(embedding))
이 글의 주제와는 다른 토픽이지만 처음 보는 파이썬 모듈이 나와서 살펴 보고 넘어 가겠습니다.
tenacity
Tenacity is a general-purpose retrying library to simplify the task of adding retry behavior to just about anything.
이 모듈은 소스 코드에서 retry 해야 할 필요가 있을 때 사용할 수 있는 모듈이라고 합니다.
에러나 예외 처리에 의해 런타임이 종료 될 때가 있는데 이때 Tenacity는 종료 없이 함수를 다시 실행시켜 주는 Python 라이브러리 입니다.
이 모듈이 깔려 있지 않으면 pip install tenacity 를 사용해서 인스톨 할 수 있습니다.
그 중에 retry와 wait_random_exponential, stop_after_attempt 함수를 import 했습니다.
이와 관련한 사용법은 아래 페이지에 있습니다.
https://tenacity.readthedocs.io/en/latest/
from tenacity import retry, wait_random_exponential, stop_after_attempt
@retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6))
이 부분은 실행중에 에러나 예외 처리에 의해 런타임이 종료 되어야 하는 상황이 오면 retry 를 하는데 그 retry 사이의 시간 텀은 1초에서 20초 사이에 랜덤하게 설정하고 retry를 6번 까지만 실행 하라는 의미 입니다.
런타임 종료 상황이 오지 않는다면 이 부분은 실행 될 일이 없는 부분입니다.
이제 본 내용인 그 다음 코드를 살펴 보겠습니다.
def get_embedding(text: str, model="text-embedding-ada-002") -> list[float]:
return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"]
embedding = get_embedding("Your text goes here", model="text-embedding-ada-002")
print(len(embedding))
get_embedding() 함수가 있는데요.
이 함수에서는 input 값인 string값과 model 값을 input으로 받습니다.
그리고 return은 list[float] 형식입니다.
그 다음 return 부분은 위에서 설명한 내용 그대로 입니다.
JSON 형식의 response 중에서 data의 첫번째 인자인 embedding 값을 return 한다는 의미 입니다.
그 다음 줄에서는 이 return 값을 embedding에 담기 위해 get_embedding 함수를 호출하고 있습니다.
print(len(embedding)) 은 이 return 값의 length를 출력 합니다.
이 소스 코드를 그대로 출력해 보겠습니다.
그러기 위해서 api key 관련 부분을 추가했습니다.
import openai
from tenacity import retry, wait_random_exponential, stop_after_attempt
def open_file(filepath):
with open(filepath, 'r', encoding='utf-8') as infile:
return infile.read()
openai.api_key = open_file('openaiapikey.txt')
@retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6))
def get_embedding(text: str, model="text-embedding-ada-002") -> list[float]:
return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"]
embedding = get_embedding("Your text goes here", model="text-embedding-ada-002")
print(len(embedding))
그리고 결과 값은 아래와 같습니다.
이 페이지는 openai api 중 embeddings_utils.py에 있는 get_embedding() 을 설명하기 위한 페이지 입니다.
이 파이썬 소스 코드에 있는 get_embedding() 함수는 아래와 같습니다.
여기서 모델은 text-similarity-davinci-001로 돼 있는데 이 model (engine) 파라미터를 text-embedding-ada-002 로 해서 보내면 됩니다.
이 파이썬에는 이 외에도 aget_embedding(), get_embeddings(), aget_embeddings(), cosine_similarity() 등 더 많은 메소드들이 있습니다.
이곳에 가면 그 내용을 볼 수 있습니다.
https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py
또 여기에 대한 내용은 제 이전 글에서도 잠깐 다룬 바 있습니다.
이 글에서 보시면 openai.embeddings_utils를 사용하는 방법을 보실 수 있습니다.
https://coronasdk.tistory.com/1263
오늘은 get embeddings의 아주 기초적인 부분을 짚고 넘어갈 수 있었네요.
이 내용은 openai-cookbook 페이지로 가서 Embeddings -> How to get embeddings로 가서면 보실 수 있습니다.
https://github.com/openai/openai-cookbook