사내 업무툴 · 가격·매칭·맞춤카톡
금액은 코드가 계산하고, LLM은 후보와 고칠 칸만 돌려줍니다
가격 계산은 구글 시트 수식에 있었고, 제안서마다 손으로 맞췄습니다. 이 수식을 코드로 옮기면서 실제 상품의 시트 값과 칸마다 대조하는 시험을 붙였습니다. 카탈로그 상품 추출과 판매 파트너사 매칭에서 LLM은 후보만 냅니다. 등록과 검토는 직원 몫입니다. 맞춤카톡의 셀러별 추천은 동료가 만든 CRM이 정하고, 저는 그 대상을 받아 보내는 발송 자동화를 만들었습니다.
- LLM이 고칠 수 있는 칸을 정했습니다. "셀러 수익금 1000으로" 같은 요청을 LLM이 역산하면 다른 금액까지 흔들립니다. 그래서 공급가·수익금처럼 계산되는 값 6개는 수정 목록에서 막았습니다. 이런 요청에는 바꿔야 할 입력값만 안내합니다. 마진율만 바꾸라고 하면 판매가는 돌려주지 않습니다.
- 시트 수식을 올림 단위까지 옮겼습니다. 파트너 공급가는 단위 올림이고, 수수료율은 코드로 고정했습니다. 시트의 실제 상품 2개(예시상품 30,000원 등)를 칸마다 대조하는 시험을 붙였습니다. 배분 비율을 바꿔도 총이익은 그대로이고, 두 몫의 합은 늘 총이익과 같다는 성질도 검사합니다.
- PDF 안의 원본 사진을 먼저 찾습니다. 페이지를 한 장씩 LLM에 보내 사진 좌표를 받습니다. 그 좌표가 PDF에 든 원본 이미지와 IoU(두 상자가 겹친 넓이 비율) 0.5 넘게 겹치면 원본을 씁니다. 화면 80%를 넘는 배경은 후보에서 빼고, 맞는 원본이 없을 때만 페이지를 잘라 씁니다. 여러 페이지에 나온 상품은 빈 가격 칸을 서로 채웁니다.
- 엑셀은 LLM이 실패해도 결과가 나옵니다. LLM 파싱이 0건이면 빈 화면을 띄우지 않고 규칙 파서가 같은 파일을 다시 읽습니다. 파일 안에 든 이미지는 순서대로 상품에 붙입니다. 750바이트 미만인 아이콘은 상품 사진으로 치지 않고 버립니다.
- RAG는 후보를 더할 뿐 새로 만들지 못합니다. 규칙 점수는 카테고리, 공구 이력, 상품 요청, 제안서 순으로 매기고, RAG 4문장 질의 결과를 합집합으로 더합니다. RAG가 돌려준 ID는 기존 거래처 풀 안에 있을 때만 받습니다. n8n에 있던 이 로직은 vitest로 시험하려고 코드로 옮겼습니다.
- 자동 발송과 화면 발송이 같은 규칙을 씁니다. 서버 조립기가 화면과 같은 상품 선택·템플릿 모듈을 불러, 같은 사람에게 다른 상품이 가지 않습니다. CRM 조회 실패와 0건은 따로 봅니다. 0건일 때만 인기 상품으로 채웁니다. 신규 셀러 카드는 한 번만 만듭니다. 사람마다 카드를 만들던 09-22에는 렌더러가 500 오류를 980건 냈습니다.
- 예약 발송은 1분마다 조금씩, 겹치지 않게 보냅니다. 맞춤 추천이 붙는 대상은 한 틱에 3명, 추천 없는 대상은 30명까지 조립합니다. 안 나간 대기분이 5건 이상이면 그 틱은 건너뜁니다. 발송 시간창이 지나면 새로 시작하지 않아 밤에 몰아 보내지 않습니다. 틱이 겹치지 않게 예약마다 잠금 행을 두고, 잡을 때 남긴 토큰이 맞아야 풀 수 있게 했습니다.
- 계정 하나는 PC 한 대에서만 돌아갑니다. 설치 토큰 확인과 사용 처리를 조건부 UPDATE 한 번으로 묶어, 한 토큰으로 두 PC가 동시에 등록하지 못합니다. 같은 인스타 계정이 두 PC에 걸리면 새로 로그인한 쪽이 이깁니다. 서버의 작업 배정 함수도 같은 규칙을 따릅니다. 하루 행동량은 매일 아침 범위 안에서 새로 뽑습니다.