04.05 크롤링 '자세히' 클릭 코드 추가 및 기타 진행 사항

2024. 4. 5. 15:16프로젝트/빵맛집 추천서비스 웹배포

 

01 문제 해결 과정


1. 별점이 없으면 정보/ 리뷰 버튼이 아예 없어서 에러가 뜬다. 대기 100초 아래 코드를 약간 수정했다.

- 밤에 돌리고 잤을 때 발생, 처음엔 몰랐는데 같은 부분에서 멈추길래 발견했다.

2. 튜터님의 첨언: 스크롤 이동 → '자세히' 버튼을 반복하면서 꼭! 누른다.
3. '정보없음' 가게가 1200개 리뷰 긁거나 하면 나온다. 랜덤으로. 은평구, 마포구 재확인하기.
- merge를 위한 index number를 따로 달아야겠다.
- 리뷰와 정보를 긁는 거에 웨이팅 코드 부여했다.
- 스크롤에 시간을 더 줘야겠다.
4. 넘버링 번호가 nan값이다. print는 잘된다.

- 리스트로 넣어야 반복되는 형태의 자료형으로 인식하고 데이터프레임이 된다.
5. 여유롭게 시간을 부여해서 에러로인한 낭비시간을 없앤다.

- 대기코드를 추가로 적용했다. (텍스트함수10, 상점누르기60>30, 리뷰누르기100, 리뷰텍스트10)

 

02 인덱스[0]을 보여주는 게 아니라 인덱스가 [0]인 코드 모두 보여준다.


 

03 '자세히' 버튼을 한번 누르면 쫙 되는 줄 알았다.


1. 짧은 페이지라서 그렇게 보였던 것이다. 실제로 버튼은 여러번 눌렸다.

2. 200씩 조금씩 스크롤을 내리는 코드만 짜면 내려가다가 다시 첫페이지 돌아오고 또 되는건?

3. 모르겠다. 스크롤을 조금씩 내리는 것보다 (내가 눈으로 보이는 페이지보다) 로딩시키는 게 중요하다고 생각해서 원래 한번에 내리는 코드로 다시 돌아갔다. 내 생각대로 잘 구현된 것처럼 보인다.

 

 

04 스크롤 마지막에 자세히는 안누르나?


 

페*카 원문 : 12시 오픈인 줄 알았는데 11시오픈이었어요 12시에 도착하고 나니 점심때라 금방 사람이 꽉 찼습니다 라구 파파르델레와 큐브스테이크 먹었는데 그냥 적당히 먹을만했어요

 

05 가게정보120개, 리뷰1316개, 정보없음가게2개, 정보없음리뷰11개


 

- 왜 1327개지? 1316+한평책빵3개 = 1319개여야 하는데?

- 은평구 merge하니까 1335-11+3개해서 1327개가 나왔다.

 

결론: 마포구에서도 '정보없음'가게가 떴는데 이제 중복되어서 수집되는 가게들이 너무 많았다. 실제로 두번 수집이 되어서 저런건지 확인해 볼 필요가 있다.

 

05 인사이트


# 라그란 무엇인가? 영어자료 https://www.youtube.com/watch?v=T-D1OfcDW1M
# 라그란 무엇인가? 한글자료 https://www.youtube.com/watch?v=g54cRchilxU
# 랭체인 위키독스 https://wikidocs.net/book/14473
# RAG 챗봇 성공 구축 사례의 구현, 라그 챗봇 보여줌 https://youtube.com/watch?v=pBValnCLrzM&si=yIDNDhG0mPTVBQF1
# 랭체인 핵심 개념 https://youtube.com/watch?v=KDM6UM-msZk&si=jhuZQacZK_9xvb8L
# LLM의 대표적인 예시 : Chat gpt
# Chat bot 만드는 방법이 있긴함 https://realpython.com/build-llm-rag-chatbot-with-langchain/
# 5분만에 챗봇, 호스팅 https://velog.io/@t_wave/gradiolangchainchatbot

 

<담당 튜터님>

# 리뷰 1개당 gpt 호출, 리뷰 다 보여야 한다.
# gpt도 성능이 항상 일정하지 않다.
# 분산안정화 : 한번할 때마다 변동이 있는 gpt를 안정화 시키고 싶은 거지.
# 그 뒤에 평균 내거나 ? ~한다? <프로젝트 노션 참고>
# 정확히는 판다스로 읽어서 for문 돌리면 된다. 인터베이션 돌리면 된다. gpt api를 사용한다.
# gpt에 입력할 수 있는 length 한계가 있다.
# 리뷰 하나당 사람이 봐서 검사를 하면 된다.
# 할루시네이션이 있는지, 뭐있는지 결국 사람이 마지막에 검사한다. 회사도 그렇다.
# 결국 정성 평가를 하게 된다.

<ㅈㅁ튜터님>

# 회사에는 변동사항에 따라 대시보드가 바뀐다.
# 스트림릿 같은 그라디오, 담당 튜터님 그라디오 자주 사용하신다.
# 튜터님은 챗봇만들 때 그라디오 쓰셨다.
# 챗봇 쓸 때 만족스러웠는지? 아니잖아 그래서 나온게 라그였다.
# 탭파이라고 파이썬이랑 연동할 수 있는 건 있다. 태블로 (데탑, 체험판 깔아야 한다.) 연동하는 게 다들 하다가 실패했음. 튜터님도 실패했다. 오류 많음.

# 그라디오, 스트림릿은 파이썬으로 띄울 수 있다.

# llm은 그라디오만, 스트림릿이 예쁨. 독스에 디자인까지 다있음.

# 그라디오가 최신 기술이다.

 

<팀원분>
# 라그 : 학습 llm + 미학습내용까지, 라그까지 하고 생각할까
# 기업에 시간과 돈을 쓸만큼 열정을 보여주는 인재를 기업에서 선호할 수 있다.

 

<ㅈㅅ튜터님>
# 인풋, 아웃풋 가격 각각 매긴다, 아우풋을 숫자만 알려줘라고 하면 저렴해진다. api 넣을 때도 비용이 발생한다. 100개정도 넣어보고 얼마 나오는지 봐본다.

# openai.com/pricing
오픈 ai에서 비용기준 테이블이다. 터보가 웹에서 무료. 지피티4터보는 써야한다.  인풋 천토큰당 10달러, 아웃풋은 천토큰당 30달러. 감당 못할 정도는 아닐 거 같고 아웃풋은 짧게 생성할거라 걱정 안해도 될 것 같다. 토큰을 짧게 넣어야 한다는게 요점이다. 한글은 토큰을 더 많이 먹는다. 안녕하세요 토큰5, 헬로우는 토큰1이다.

# http://m.openai.com/tokenizer
가격 책정 미리 알 수 있음.

# 처음에 조건을 설명할 거잖아. (input 설명을 영어로 넣기, 요구 사항만 영어로 넣기, 댓글은 한글로 넣기, 댓글은 영어로 번역할 필요 없음.) 아웃풋을 만들 때는 설명없이 오직 1에서 9의 숫자만 써 줘.

# api에 for문으로 돌리기
import openai

# api 키 지정하여 클라이언트 선언하기
openai_api_key="키받기"

# 로그인하면 api를 클릭하고 api keys를 왼쪽상단에서 클릭하고 본인 정보 넣어서 발급 받기-settings 선불제로 바뀌었음 저번달에-billingdp 10불씩 한명씩 충전하면 되지 않을까? 이제 파이썬 환경에서 api쓸 수 있음.

# docs에 Chat Completions 안내서 한번 보기

# 주피터 파일 보내줄테니 한번 해보기

# api키는 웬만하면 공개하지 말기 공유하지 말기

# system 롤에 우리의 요청을 보내면 된다.

# 번역기는 DeepL 번역기를 쓰신다.

# 특히 이부분으르 강조하고 싶을 때 **이거 추가**

# 쳇지피티가 언어모델이라 마크다운을 학습해서 강조된다는 걸 알고 있다.

# 이게 프롬프트 엔지니어링임. 계속 바꿔줘. 질문.

# **제발(꼭, 반드시) 부연 설명 없이 -1~1 사이의 숫자만 말해줘**
이렇게 하니까 숫자만 말한다. -> 정확한 질문을 해야 기계도 정확히 답변해준다.

# 이제 pandas 데이터프레임을 만들어서 df.apply랑 람다함수 이용해서 답변을 구하는 걸 for문을 돌린다. system_prompt, prompt 입력값을 넣어가면서 진행한다.

# 일단 3.5 터보모델을 추천한다.

# 충분히 성능 나온다 싶으면 결제하면 된다. 웹에서 테스트를 충분히 해보고, 만번을 해볼 수 없으니까 그때 api 돌리면 된다. 점수를 어떻게 매길지, 프롬프트 엔지니어링을 어떻게 할지는 try/error로 잡는 거다.

# 피자 구문은 걍 질문만 하고 싶을 때 user 롤만 넣음.

# syspem_prompt도 매번 들어가는거라 영어로 바꾸는 것이다. 돈 드니까.

# 오른쪽 열에 토큰 추가해놓으면 n빵할 때 좋음.

# 1M 밀리언 토큰 /1K 천 토큰

# 스트림릿, 아래는 래그로 돌리고 있음 LAG로!!

# LAG는 추천시스템이랑 비슷한 영역이라고 볼 수도 있는데 줄글을 가지고 쪼갠다음에 내가 A질문을 하면 A라는 질문이 쪼갠거중에 어디에 있는지 찾는다. 그 중에 pick하는게 lag이다. 어떻게 찾는 방법론이 lag인거고 복잡한 과정을 거치는 것. 챗봇의 원리는 질문을 들고오면 쓱 가지고와서 위에 붙인다음에 챗지피티에 고대로 인풋을 넣는 것이다. 이게 lag-chatbot의 원리.

# 근데 우리는 줄글에서 픽을 하는 게 아니라 추천해주는 거니까 다른 걸 추천하셨다.

# 사용자의 질문이 들어오면 얘도 벡터화 하는 것이다. 여기서 임베딩 기술이 들어감. 한 다음에 두 벡터(하나는 유저의 질문, 하나는 가게들의 지표들의 점수)가 가장 유사한 얘들. 코사인/뉴플리디선디스턴스 3개정도 픽을해서 아웃풋으로 가게정보를 넣어주는 것이다.

# 이건 lag까지는 아니고 추천 모델 이렇게 만들면 되겠다.

# 군집화를 한 다음에 사용자의 질문이 어느 군집인지 찾음 - 군집에서 가장 유사한 애를 픽해서 알려주겠다.

# 사실 군집화를 가지고 어떻게 사용할지는 조금 고민해봐야겠다. 군집화 아닌 애들은 추천이 안되는거니까. 추천시스템이 군집화를 어떻게 녹일지는 조금 고민해볼 사항이다.

# 스트림릿이라는 애가 결국 태블로마냥 대시보드를 파이썬으로 만들 수 있게 제공을 하는 라이브러리다. 얘는 사용법이 굉장히 쉬워서 진짜 쉽게 만들 수 있다.

# 그분들은 스트림릿으로 발표한 분들도 있다. 웹에 배포하는 것까지 도와드린 적이 있다.

# 결국 내 결과물을 어필해야하니까 why not의 개념으로 스트림릿 어렵지 않으니까 메리트 있다. 파이썬으로 구현하기 쉬우니까 인기가 많은 것도 있고 (살짝 개발의 영역) 사람들이 디자인 올린게 많으니까 템플릿 삼아서 만들 수 있기 때문에 우리의 그래프를 인터렉티브하게 보여줄 수 있다는 장점.

# 이게 뜬 이유는 머신러닝 예측모델을 같이 넣을 수 있다. 결과를 같이 보여줄 수 있다는 장점. 태블로는 안되는 걸로 알고 있음. 그래프(맥플롯/시본)를 그대로 넣을 수 있음. 라이트한 엔지니어를 위한 대시보드 툴이다.

# 분석한걸 탭으로 넣는 거다. 다른 사람이 추천해준걸 하나씩 넣는거다. 다양한 시각화를 할 수 있음이 어필된다.

 

<팀회의>
# 프로젝트 방향 재설정

1. 크롤링으로 키워드뽑는다.

2. 클러스터링으로 가게 정의를 내린다.

3. 기초 통계량 분석에 추가한다.

4. 분석결과를 시각화한다.

5. 추천 모델링과 클러스터링의 분리!

 

<개인 인사이트>

1. 전문을 모두 잘 가져왔는지는 CSV파일로 확인한다.
2. 마지막 가게 자세히 버튼이 안눌리는 건 for문이 끝나서였다.
3. 비지도는 정답이 없고 있더라도 사용하지 않음. 분류와의 차이이다.
4. html 크롤링 팁은 무조건 규칙이 있다는 것이다. 뜯어보면 나온다.

5. 리스트 안에 두개의 요소를 가진 튜플을 넣으면 각각 분배된다.

for a, b in [([1,2,3], [3,4,5])]:
    print(a)