Skip to content

Instantly share code, notes, and snippets.

@Jonghakseo
Last active March 29, 2023 06:04
Show Gist options
  • Save Jonghakseo/e3875f48bab9caecbfadb79ebbe4383e to your computer and use it in GitHub Desktop.
Save Jonghakseo/e3875f48bab9caecbfadb79ebbe4383e to your computer and use it in GitHub Desktop.
Note-for.me

어학당 챗봇 Proof of Concept

아이디어

  1. openai에서 공개한 chatgpt api는 최대 요청 가능 텍스트의 길이가 정해져 있음 (max_token: 4096토큰: 약 3000 단어)
  2. 그런데 chatpdf.com 등의 서비스를 보면, 대용량의 pdf문서를 입력한 상태에서 내용을 요약해주는 모습을 볼 수 있음
  3. max_token 제한을 어떻게 우회한 것인지 찾아보기 시작
  4. text embedding 을 통해 ChatGPT에게 질문 할 때, 관련 컨텍스트를 같이 보내준다는 것을 알게 됨
  5. chatgpt에 제공할 수 있는 컨텍스트가 사실상 무제한으로 늘어난다는 사실을 알게 되었음
  6. 사내 풍부한 컨텐츠를 바탕으로 chatbot 서비스를 만들 수 있을 것 같다는 생각을 함

리서치

텍스트 임베딩

링크의 글을 간략하게 요약한 내용

image.png openai 등의 llm(대형 언어 모델)을 바탕으로 구조화되지 않은 텍스트를 구조화된 형식으로 변환하는 것.

모델이 클수록 차원수가 더 많고, 각 차원은 텍스트에 대한 하나의 추가 정보를 저장. 차원 수가 증가할수록 표현력 + 정밀도가 증가

예시: "show me boston ground transport"라는 텍스트를 2048차원으로 아래와 같이 임베딩 할 수 있음

[0.20641953, 0.35582256, 0.6058123, -0.058944624, 0.8949609, 1.2956009, 1.2408538, -0.89241934, -0.56218493, -0.5521631, -0.11521566, 0.9081634, 1.662983, -0.9293592, -2.3170912, 1.177852, 0.35577637, ... ]

2048개의 차원을 표현할 수 없기 때문에 극단적으로 차원을 압축시켜서 이해하기 쉽게 만든다면 아래와 같이 표현할 수 있음

image.png

티켓에 대한 문의, 항공편에 대한 문의, 지상 교통편에 대한 문의 질문들을 2차원 좌표상에 위치시키면, 비슷한 질문들이 어떤 분포를 이뤄 위치한다는 것을 알 수 있음.

이를 바탕으로 어떤 질문이 추가적으로 들어왔을 때, 좌표 평면상 어떤 위치에 있는지를 파악한다면 그 질문이 다른 어떤 질문들과의 유사성을 갖고 있는지 파악할 수 있을 것임.

예를 들어 비즈니스 요금을 보여달라는 문의에 대해 유사한 다른 질문들을 뽑아내면, 질문에 좌석(class)이 라는 단어가 포함되어 있지 않음에도 일등석 좌석에 대한 문의를 가져옴. 그리고 유사한 질문에는 business라는 워딩도 없음.

New inquiry:
show business fares 

Most similar FAQs:
Similarity: 0.52;  show me round trip first class tickets from new york to miami
Similarity: 0.43;  i'd like the lowest fare from denver to pittsburgh
Similarity: 0.39;  show me a list of ground transportation at boston airport

즉 의미론적으로 유사한 텍스트들을 임베딩을 통해 추출할 수 있다는 의미.

새 질문의 위치가 일등석 요금 질문에 대한 위치와 가장 가깝다는 것을 볼 수 있음. image.png


로미오와 줄리엣 책 기반으로 설명을 해 주는 예제

파라미터

temperature

temperature

image.png

top_p

top-p

image.png

어학당 챗봇 POC Flow

  1. 어학당 페이지 url 에서 html 문서 기반의 자료를 가져온다.
  2. 텍스트를 일정 크기로 자른다. 텍스트를 자를 분량 테스트 필요
  3. chatgpt에게 해당 자료가 무슨 어학당의 자료인지 대략적으로 설명해주고, 어학당을 잘 모르는 사람한테 설명할 수 있도록 친절하고 자세하게 정리해달라고 한다. 정리 요청 프롬프트 테스트 필요, temperature, top_p 값 변경하며 테스트 필요
  4. 정리한 내용을 바탕으로 docs를 만든다.
  5. 만들어진 docs를 임베딩해서 벡터 스토어에 넣는다.
  6. 질문 -> 질문에 대한 임베딩 질문 키워드 / chatgpt에게 요청하는 사전 프롬프트를 분리하는 방식으로 개선 가능할 것으로 보임
  7. 임베딩한 결과로 db에서 docs 조회 (연관성이 있는 텍스트를 함께 첨부해서 전송)
  8. docs를 싣고 openai api 호출 temperature, top_p 값 변경하며 테스트 필요
  9. 결과 반환

비용

스크린샷 2023-03-27 오전 3.39.39.png

사전 데이터 세팅: 전체 어학당 + 메인 페이지 기준

  • gpt3.5-turbo 약 50,000 토큰
  • text-embedding-ada-002 약 10,000 토큰

50,000/1000 * 0.002$ = 0.1$ 10,000/1000 * 0.0004$ = 0.004$

총 0.104$ = 약 135원

1회 요청시

  • gpt3.5-turbo 약 2~3,000 토큰
  • text-embedding-ada-002 약 100 토큰 이내(입력 양에 따라 다름)

3,000/1000 * 0.002$ = 0.006$ 100/1000 * 0.0004$ = 0.00004$

총 약 0.006004$ = 약 8원

가격을 줄이는 방법

  1. docs를 싣고 openai api 호출

요 프로세스에서 docs를 덜 들고 가면 됨

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment