일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kotlin collection
- video caching
- 스피너
- 카카오톡 웹뷰
- android exoplayer
- ktor api call
- build with ai
- AWS EC2
- 안드로이드
- exoplayer cache
- ListAdapter
- Python
- android custom view
- FastAPI
- 유튜브
- map
- 시행착오
- 독서
- kotlin list
- android ktor
- getChangePayload
- ChatGPT
- DiffUtil.ItemCallback
- list map
- android
- llm
- ktor client
- ExoPlayer
- ListAdapter DiffUtil
- doc2vec
- Today
- Total
버튼 수집상
[LLM] GPT 와 Claude API로 게시글 요약을 시키면서 배운 것들 본문
1. 한글 한 글자당 1.05 ~1.06배의 토큰이 소요된다.
거의 1:1로 생각하면 된다.
예를 들어 GPT4o-mini에 입력 토큰값 상한선이 128K라면 한글을 대략 12.2만자 정도 입력할 수 있다.
영문은 한 글자당 토큰이 0.2배 정도 소요되는 것과 확연히 비교된다.
2. GPT와 Claude API에는 티어Tier에 따른 사용 제한선이 있다.
최신 LLM의 컨텍스트 윈도우 값만 보고 서비스를 기획하면 안 된다.
티어는 사용자의 월 결제 금액과 사용량에 따라 정해진다.
분당토큰제한(TPM: Tokens Per Minutes)도 있다.
3. Claude API에는 일일 토큰제한도 있다.
티어2 기준, Claude API에서 하루에 쓸 수 있는 토큰은 250만개이다. (Claude 3 Haiku 는 2500만)
Claude 3.5 Sonnet의 컨텍스트 윈도우 200K 기준으로 하루에 11+ 번 정도 호출할 수 있다는 것을 유념한다.
물론 티어가 올라가면 일일제한 상한선도 올라간다.
4. Claude의 API의 사용자 티어를 올리는 법은 아직 자세히 모르겠다.
GPT의 경우, 한 달치 충전금액을 다 쓰고 새로 충전하니 티어가 올라갔다.
Claude는 그러지 않았다.
이에 대해 영업팀에 문의 메세지를 남겼지만 아무런 답변을 받지 못했다.
5. 결과물의 길이를 지정하는 것이 제대로 되지 않는다.
'입력한 게시글이 3000자 미만일 때는 요약글을 1000자 이내로,
입력한 게시글이 5000자 미만일 때는 요약글을 2000자 이내로 출력하라'
.. 와 같은 지시사항대로 출력되지 않는다.
추정 1) 영어와 달리 한글을 한 글자당 2바이트 정도 돼서 계산이 달라졌다.
그러나 바이트 길이로 지정해도 결과물은 똑같았다.
추정 2) 단순히 출력에 필요한 토큰값이 모자랐다.
입력 토큰과 출력 토큰을 모두 더해서 계산되므로.
6. 민감한 개인정보를 LLM에 직접 넘기지 말고, 후처리하기 좋은 형태로 출력한다.
요약글 끝마다 원글 링크를 달아야 했다.
게시글 링크는 index를 넣으면 되는 간단한 형태다.
https://test-bbs.co.kr?bbs_type=81&idx={INDEX}
LLM에게 링크를 넘기지 않기 위해서, 아래처럼 프롬프팅을 했다.
test_prompt = """
You are tasked with summarizing the five most commented posts from the Internet forum called '○○○', including the comments.
The objective of this task is to provide a easy-to-read, daily summary of the most trending forum posts of the day for heavy users.
You will be provided with one input:
<five_posts_and_comments>
{five_posts_and_comments}
</five_posts_and_comments>
Follow these steps:
1. For each of the five posts:
a. Identify the main subject.
b. Address the various opinions or the most trending debate among the posts and comments and provide a summary of 100-200 letters.
c. Quote 3 most iconic comments that represents each different points of view and do not include the number of likes to the output.
d. Add "<a>원글 보러가기</a>" to the last bullet point, for formatting purpose.
2. Keep in mind the following points:
a. ....
b. ....
3. Respond in a friendly tone and manner as if you are telling your really close friend what's the tea.
Your output must be formatted as follows:
"GPT가 요약한 오늘의 화제를 알려드릴게요!"
<Number of the post>. <Main subject of the post>
<Summary of opinions and the main debate in a friendly korean that ends in '-요' that is 200 letters long>
- "<Iconic comment 1>"
- "<Iconic comment 2>"
- "<Iconic comment 3>"
<a>원글 보러가기</a>
"""
출력 지시문 1번의 d 항목에서 Add "<a>원글 보러가기</a>" to the last bullet point, for formatting purpose. 라고 지시했다.
차후 링크를 달아야할 부분에 a 태그를 출력하도록 지시한 것이다.
그리고 LLM 출력 결과를 파싱해서 href 속성을 추가했다.
import get_5_most_replied_posts_of_the_day
import ask_gpt_4o_mini
from datetime import datetime
from bs4 import BeautifulSoup
from util import replace_amp
test_prompt = "...." # 위에서 적은 프롬프트
"""
요약할 게시글 5개를 출력
"""
posts = get_5_most_replied_posts_of_the_day()
"""
프롬프트 템플릿 가져와서 포맷팅
"""
test_prompt = test_prompt.format(five_posts_and_comments=posts)
"""
GPT에게 물어보기 (API 호출하는 함수)
"""
start_time = datetime.now()
result = ask_gpt_4o_mini(test_prompt)
seconds = datetime.now() - start_time
print(f"{seconds}초 소요!")
# print(result)
"""
원글 보러가기 링크 포맷팅 (GPT에게 링크는 넘기지 않는다!)
"""
soup = BeautifulSoup(result, 'html.parser') # 결과물을 html 문서로 파싱
for i, tag in enumerate(soup.find_all('a')):
# 요약시킨 글이 5개라 a 태그도 5개 출력됨
link = f"https://test-bbs.co.kr?bbs_type=81&idx={posts[i]['index']}"
tag['href'] = link
final_result = replace_amp(str(soup))
return final_result
이런 식으로 LLM이 요약시킨 내용에 원글 링크를 추가해서 출력한다.
다만, LLM에서 삑사리가 나서 <a></a> 태그 없이 결과가 출력된다면, 파싱이 안 되면서 링크가 제대로 붙지 않을 것이다😅
replace_amp() 함수는 beautifulsoup으로 태그 속성을 더했을 때, & 글자 뒤에 amp; 가 붙는 현상을 해결하기 위해서 만들었다.
def replace_amp(text: str) -> str:
return re.sub('amp;', '', text)
원인을 알면 좋겠는데 우선 이렇게 처리했다.
더 나은 방법을 찾으면 글을 수정하거나 아래에 덧붙이겠다.
7. 크론탭으로 요약글 생성 스크립트를 돌릴 때, 파이썬 실행파일의 위치를 제대로 명기한다.
하루에 한 번 게시글을 요약해야 하기 때문에 크론탭 스크립트를 적었다.
# crontab -e 로 크론탭 수정
# 매일 9시에 요약글 생성해서 log로 저장
0 21 * * * echo $(python3 /Users/youngin/pycharmprojects/summary/summarize_posts.py) >> log
그런데 정해진 시간에 제대로 실행이 안 되고 있었다.
알고 보니 python3 실행파일 위치를 제대로 써야했다.
평소에 사용하는 아나콘다 실행환경을 적었다.
# crontab -e 로 크론탭 수정
# 매일 9시에 요약글 생성해서 log로 저장
0 21 * * * echo $(~/opt/anaconda3/bin/python /Users/youngin/pycharmprojects/summary/summarize_posts.py) >> log
자신이 사용하는 파이썬 실행파일의 위치를 적으면 되겠다. 예) /usr/bin/python3
'TIL - LLM' 카테고리의 다른 글
ChatGPT에게 감사인사를 해야할까? 관련 글들 모음 (0) | 2023.08.17 |
---|---|
AI의 답변을 신뢰감 있는 방식으로 정리하고 전달하는 법 by ChatGPT (0) | 2023.07.17 |