1. 프로젝트 소개 및 개요
이화여대 컴퓨터공학과 [캡스톤 디자인 및 창업 프로젝트 A] 수업의 졸업프로젝트로,
우리 팀은 Once(원스) 애플리케이션을 고안하고 개발하게 되었다.
Once 프로젝트 소개
원스는 결제처에서 사용자가 보유한 카드 중
가장 혜택이 좋은 카드를 추천해주는 핀테크 모바일 애플리케이션이다.
우리 팀은 매년 사라지는 카드 포인트 1000억원이 소비자가 아닌 카드사의 부가수입으로 들어간다는 점,
그리고 1인당 신용카드 보유 개수는 무려 3.9장 이지만, 휴면카드가 1300만장에 육박한다는 사실에 주목했다.
소비자들은 자신이 보유한 모든 카드의 혜택을 관리하고 파악하기 어려워한다.
원스는 사용자가 카드 결제 전, 보유한 카드 중 결제처에서 최적의 혜택을 받을 수 있는 카드를 추천해줌으로써,
손쉬운 카드 관리 서비스를 제공한다.
Once (원스) 가 제공하는 서비스
1) 회원가입은 기본적으로 ID/PW 방식으로 이루어지며, 아래의 두가지 단계를 따른다.
- CODEF API 의 accessToken과 connectedId를 발급받아 계정 등록
- 발급받은 connectedId를 이용하여 사용자의 보유 카드 목록 조회
2) 로그인 후 Once 어플리케이션 이용이 가능하며, 크게 5가지 서비스를 제공한다.
- 홈(카드 추천 챗봇) , 푸시 알림 서비스, 마이 월렛, 나의 혜택 정보, 마이페이지
프로젝트의 전체적인 흐름도는 다음과 같다.
Tech Stack
Once 앱에서 사용하는 기술 스택 및 프로젝트 구조도는 다음과 같다.
- Version Control : Git, Github
- Communication : Notion, Discord
- Development Tool : XCode, Android Studio, IntelliJ
- Design Tool : Figma
- Front-End : React Native (JavaScript)
- Back-End : Spring Boot (Java)
- Cloud Hosting : AWS (EC2, RDS, S3)
- Crawling Library : BeautifulSoup, Selenium
- AI Model : OpenAI GPT3.5 API Fine-tuning
[ 프로젝트 github ]
EWHA-LUX
EWHA-LUX has 5 repositories available. Follow their code on GitHub.
github.com
Open Source API
Once 앱에서 사용하는 API 종류와 공식문서 링크는 다음과 같다.
- CODEF API 보유카드 조회 https://developer.codef.io/products/card/common/p/account
CODEF API 개발가이드
CODEF API 개발 명세서와 기술 문서를 확인해 보세요
developer.codef.io
- CODEF API 실적 조회 https://developer.codef.io/products/card/common/p/result-check
CODEF API 개발가이드
CODEF API 개발 명세서와 기술 문서를 확인해 보세요
developer.codef.io
- CODEF API 승인내역 조회 https://developer.codef.io/products/card/common/p/approval
CODEF API 개발가이드
CODEF API 개발 명세서와 기술 문서를 확인해 보세요
developer.codef.io
- Geolocation API (GPS) https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API
Geolocation API - Web APIs | MDN
The Geolocation API allows the user to provide their location to web applications if they so desire. For privacy reasons, the user is asked for permission to report location information.
developer.mozilla.org
- GPT 3.5 Turbo API https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates
GPT-3.5 Turbo fine-tuning and API updates
Developers can now bring their own data to customize GPT-3.5 Turbo for their use cases.
openai.com
2. 스크래핑 기반 금융 API를 이용한 사용자 정보 조회
Once는 결제할 매장을 입력하면, 사용자가 보유한 카드 중 최적의 혜택을 가진 카드를 추천해주므로,
아래의 3가지 카드 정보를 조회해야 한다.
우선 Once 서비스가 가능하기 위해서는 아래의 3가지 내역을 필수적으로 불러왔어야 하므로,
해당 API를 불러오는 과정부터 기술 개발을 시작하였다.
1) 사용자 보유 카드 조회 : 보유 카드 중 최적의 혜택을 가진 카드를 추천
2) 카드 실적 조회 : 전월 실적 충족 여부에 따라 혜택이 좋은 카드가 변함
3) 승인 내역 조회 : 승인 내역을 바탕으로, 자주 이용한 단골 매장 근처에서 카드 추천 알림 푸시 서비스 제공
원래 금융결제원 오픈 API를 이용하려고 하였으나,
사업자 등록 이슈와.. 복잡한 승인 과정으로 인하여 CODEF API를 이용하게 되었다.
현재는 DEVELOPER 계정을 이용하여 API 테스트 및 개발을 진행하고 있으며,
이후 출시를 위해서는 BUSINESS 계정을 구매할 예정이다.
카드 승인 내역 조회 API 테스트
accessToken 발급과 API 조회 가능 여부를 확인하기 위해
우선 카드 승인 내역 조회 API 테스트를 진행하였다.
- CODEF API 승인내역 조회 https://developer.codef.io/products/card/common/p/approval
CODEF API 개발가이드
CODEF API 개발 명세서와 기술 문서를 확인해 보세요
developer.codef.io
1) accessToken 발급
Query 파라미터와 Header에 아래의 정보를 입력하여 access Token을 발급받았다.
이때 Authorization으로는 개인별 base 64 인코딩 값을 넣으면 된다.
- POST : https://oauth.codef.io/oauth/token
[Query Params]
1) grant_type : client_credentials
2) scope : read
[Header]
1) Content-Type : application/x-www-form-urlencoded
2) Authorization : Basic [base64 인코딩 값]
Response 메시지를 확인해보면, 200 OK로
accessToken 이 제대로 응답온 것을 확인할 수 있다.
2) 카드 내역 조회
입력부는 아래의 API 명세서를 따라 작성한다.
[ 입력부 (Input) ]
1) countryCode : KR
2) businessType : CD
3) organization : 0306 (신한카드 코드, 카드사마다 정해진 코드번호가 있음)
4) clientType : P
5) loginType : 0
6) certType : 1
7) derFile / keyFile : 아래의 코드 참고
이때 derFile과 keyFile은 Base64 인코딩을 활용해
문자열로 변환된 값을 입력한다.
def encode_to_file_string(file_path: str) -> str:
파일을 base64 문자열로 인코딩
:param file_path: 파일 경로
:return: 인코딩된 file string
fp = open(file_path, 'rb')
data = fp.read()
fp.close()
return base64.b64encode(data).decode('utf-8')
print(encode_to_file_string('def 파일 경로'))
print(encode_to_file_string('key 파일 경로'))
{
"organization": "0020",
"connectedId": "3Lj7J-OvQ",
"birthDate": "",
"startDate": "20190601",
"endDate": "20190619",
"orderBy": "0",
"inquiryType": "1",
"cardName": "",
"duplicateCardIdx": "0",
"cardNo": "6253123456780000",
"cardPassword": "",
"memberStoreInfoType": ""
}
API를 호출하면 아래와 같이 최근 사용한 카드 내역 순으로
카드 승인 내역 조회가 출력되는 것을 확인할 수 있다.
처음에는 사용자의 민감한 카드 정보를 불러올 수 있을지가 우리의 중요한 문제였는데,
API 테스트를 통해 사용자 개인의 카드 승인 내역 및 보유카드 내역을 불러올 수 있다는 기술 검증을 할 수 있었고,
해당 주제로 계속해서 개발을 진행해나가게 되었다.
3. 카드 추천 GPT 3.5 Turbo Fine-Tuning
API 테스트를 통한 주제 검증을 완료한 이후,
본격적으로 카드 추천 모델 개발을 진행하였다.
사용자가 결제를 원하는 매장의 상호명(스타벅스, GS25 등)을 입력하면,
보유한 카드 중에서 가장 혜택이 좋은 카드를 추천해주기 위해 GPT Fine-Tuning 을 수행하였다.
Fine-Tuning 이란?
- 기존에 학습된 딥러닝 모델이 특정 작업을 더욱 효과적으로 수행하도록 추가 학습을 진행
- 기존 모델의 지식을 기반으로 새로운 작업에 대한 세부 정보를 학습하여 성능 향상
- Once의 경우 기존의 GPT API에 카드 추천 데이터셋을 학습시켜, 결제처를 입력하면 최적의 카드를 추천해주도록 성능 개선
GPT 3.5 Turbo Fine-Tuning을 선택한 이유
먼저 Once는 챗봇 형태로 사용자에게 카드 추천 서비스를 제공하므로,
Chat Completions를 통해 대화 형식으로 Fine-Tuning할 수 있는 GPT 3.5가 적합하다고 판단했다.
또한 GPT 3.5에서는 사용자 보유 카드 리스트와 전월 실적 충족 여부를
prompt에 별도의 입력 없이, 기본 backgound 형태로 불러올 수 있으므로 토큰 절약과 편의성 면에서도 적합하다고 판단하였다.
- GPT 3.5 Turbo API https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates
GPT-3.5 Turbo fine-tuning and API updates
Developers can now bring their own data to customize GPT-3.5 Turbo for their use cases.
openai.com
Fine-Tuning Input / Output 선정 과정
모델의 학습 능력 향상과 정확성을 위해서는 적절한 input과 output 을 찾아야 한다.
우선 처음 우리 팀이 생각한 구현 방법은 아래의 4가지 방식이었다.
1) Prompt로 [사용자가 보유한 카드 혜택 정보 + 실적 충족 여부 + 결제처] 입력
”prompt” : “<결제처, [카드 1, 카드 1 상세 혜택, 카드 1 실적 충족 여부], ...,
[카드 N, 카드 N 상세 혜택, 카드 N 실적 충족 여부]>”, “completion” : “<결제처에서 사용할 카드>”}
[ 문제점 ]
해당 방법을 사용하는 경우 사용자별로 fine-tuning을 진행해야 함
2) Prompt로 [결제 매장, 카드 1개 이름, 해당 카드의 혜택] 입력
{"prompt":"결제 매장:GS25\n확인 카드:Deep Dream Platinum+\n카드혜택:~~~",
"completion":"할인금액:10000원 이상 5% 할인"}
사용자가 보유한 카드가 각각 1,2,3이라면 3개의 카드를 각각 3번 모델에 입력한 후,
혜택이 좋은 카드 순서대로 정렬한다.
사용자의 특정 정보(전월 실적/최대 혜택 금액)는 개별 사용자에 맞게 조절되어야 하므로,
파인튜닝이 아닌 시스템 알고리즘으로 동적 계산한다.
[ 문제점 ]
- GPT2.0 모델을 사용한다면 적합한 방식이나, 정확성이 떨어질 수 있음
- 카드 혜택 정보를 모두 prompt로 입력할 시 토큰이 부족할 수 있음
- 시스템 단에서 전월 실적과 최대 헤택 금액을 위한 알고리즘을 별도로 설계해야 함
3) 앞선 1번과 2번 방식을 합쳐서 구현
- GPT 모델 1 : [결제처, 카드명, 카드의 혜택]을 보고 사용할 수 있는 카드 혜택을 찾음
{”prompt” : “<결제처, 카드명, 그 카드의 혜택, 실적 조건>”,
“completion” : “<결제처에서 해당 카드로 누릴 수 있는 혜택(실적 채운 경우와 채우지 못한 경우 나눠서)>”}
- GPT 모델 2 : 직접 사용자가 [결제처]를 입력하면, [사용할 카드]를 알려줌
{”prompt” : “<[결제처 A, 카드명1, 결제처에서 해당 카드로 누릴 수 있는 혜택1], ... , [결제처 A, 카드명N, 결제처에서 해당 카드로 누릴 수 있는 혜택N]>”,
“completion” : “<결제처, 사용할 카드, 그 카드의 혜택>”}
[ 문제점 ]
- 카드 혜택 정보를 모두 prompt로 입력할 시 토큰이 부족할 수 있음
- 2개의 GPT 모델을 파인튜닝 해야 함
앞선 prompt와 completion 방식 모두 토큰 이슈나 정확성이 떨어진다는 문제점이 있어,
아래의 4번째 방식을 채택하고 파인튜닝을 진행하였다.
4) Chat Completion 사용 & 카드 리스트 및 전월 실적 충족 여부 background 정보
카드 리스트와 전월 실적 충족 여부는 background 정보로 넣어두고,
아래의 chat completion 의 방식을 통해 대화형식으로 fine-tuning 하여 챗봇 서비스에 더 맞춤화 하였다.
[
{"role": "system", "content": "You are a financial assistant providing credit card recommendations."},
{"role": "assistant", "content": "Sure, I can help you find the card with the best benefits."},
{"role": "user", "content": "[결제처]. What's the best card for this?"},
{"role": "assistant", "content": "Got it. Let me check your cards. You have the [Card A], [Card B], and [Card C]."},
{"role": "user", "content": "Yes, those are my cards."},
{"role": "assistant", "content": " the [Card B] offers the highest cashback at [결제처], with 5% cashback on purchases. Additionally, it provides 2% cashback on groceries"},
]
해당 chat completion 방식으로 현재 Fine-Tuning을 진행하고 있으며,
최종 개발 까지 최소 5000개의 데이터 셋을 학습시켜 정확도를 높여나갈 예정이다.