Proxy 쓸 때 Json parsing 오류
카카오테크캠퍼스 4기 1단계 클론 코딩을 하던 중,
json 파싱 오류가 종종 발생하는 문제가 생겨 났습니다.
멘토님께서 openai API를 직접 쓰는 게 아니라 프록시를 거쳐서 쓸 때 발생할 수 있는 문제라 하셨고
해결 방법을 고민해 보라 하시며 힌트를 하나 주셨습니다. ToolStrategy 를 알아보라 하셨습니다
먼저 JSON 부터 알아보겠습니다.
json 은 컴퓨터끼리 정보를 주고받을 때 쓰는 약속된 편지 형식이라 생각하면 쉽습니다.
{"title": "미팅", "date": "2026-07-10"}
그 다음 '파싱' 을 알아보겠습니다.
파싱은 저 json 글자 뭉치를 컴퓨터가 읽고 이해하는 것 입니다. 제가 지금 하고 있는 카나나 (일정관리 Agent AI 시스템) 은 LLM(AI)이 보낸 텍스트를 받아서 json.loads(...) 라는 함수로 자연어 문자열을 진짜 데이터로 바꾸는 동작을 합니다.
파싱 에러란, 저 json 형식 규칙을 AI 가 가끔 완벽하게 지키지 않고 보낼 때 일어납니다.
- 중괄호를 하나 빼먹거나 ({"title": "미팅" ← 닫는 } 없음)
- 글이 중간에 뚝 잘리거나 ({"title": "미)
- 따옴표를 빼먹거나 ({title: 미팅})
이런식으로요, 이러면 우리 프로그램이 규칙에 맞지 않는 내용은 읽지 못하고 error 를 뱉어냅니다.
이게 json 파싱 에러 입니다.
제가 지금 만들고 있는 시스템은 OPEN AI 키를 직접 받아와서 사용하는게 아닌, 프록시 서버를 사용하고 있습니다.
(여기서 프록시는 우체국 같은 중계소라고 이해하면 편합니다.)
여기서 LangChain 과 관련 된 오류가 발생합니다.
LangChain은 스키마만 넘기면 기본적으로 AutoStrategy가 동작해서, 지금 쓰는 모델이 구조화 출력을 잘 지원한다고 판단되면 자동으로 ProviderStrategy(모델이 직접 JSON을 써서 답하는 방식)를 선택합니다.
그래서 가끔 프록시를 통해 문자가 찌그러진 상태로 오면? 못 읽고 에러를 발생 시킵니다.
https://github.com/langchain-ai/langchain/issues/31367
Repeated "assistant" role concatenation in `_convert_dict_to_message` breaks structured‑output parsing · Issue #31367 · lang
Checked other resources This is a bug, not a usage question. For questions, please use GitHub Discussions. I added a clear and detailed title that summarizes the issue. I read what a minimal reprod...
github.com
비슷한 사례가 깃허브에 있다고 멘토님께서 알려주셔서 읽어 봤습니다.
위의 사례 또한 프록시 서버를 거쳐서 openai 를 호출하였고, pydantic 스키마 형태로 답을 받으려고 했던 상황이었고, 프록시를 거치면 구조화 출력 파싱이 깨진다는 사례였습니다.
다만 제 사례와의 차이점은 전 streaming 방식을 쓰지 않고 통째로 응답 받는 방식이라 assistant 조각들이 중복 연결 되는 이 이슈의 정확한 버그와는 차이가 조금 있긴합니다.
공통점은 "프록시 + structured output = 가끔 JSON이 깨진다" 는 패턴뿐이고, 정확한 기술적 원인(스트리밍 조각 병합 버그 vs strict schema 미준수)은 다릅니다.
ToolStrategy
StructuredRequestBatch 스키마를 진짜 tool(함수)처럼 등록해두고, AI한테 "일정 알고 싶으면 tool 처럼 StructuredRequestBatch라는 함수를 호출해서 인자값을 채워 넣어라"라고 시키는 방식입니다.
ProviderStrategy는 자유 텍스트로 JSON 을 직접 쓰지만 ToolStratgy는 정해진 함수를 호출하듯 인자만 채웁니다.
일반 함수 호출 방식이라 프록시에서도 안정적입니다.
# 전
response_format=StructuredRequestBatch,
# 바꾼 후
response_format=ToolStrategy(schema=StructuredRequestBatch), #AI가 채워야 할 양식을 지정하는 자리
- AI가 StructuredRequestBatch라는 이름의 가짜 tool을 호출하는 형태로 응답
- LangChain이 그 tool 호출 인자를 받아서 StructuredRequestBatch(...) 객체로 검증/변환
이런식으로 정해진 틀에서 json이 나오게 하면 됩니다
이렇게 바꾸고 나서 여러 번 테스트해봤는데 JSON 파싱 에러 없이 안정적으로 구조화된 답변이 나오는 걸 확인했습니다. 프록시 환경에서 structured output을 쓸 때는 ProviderStrategy보다 ToolStrategy가 더 안전한 선택인 것 같습니다.
아 이해하는데 너무 힘들어서 머리에서 열이 엄청 나네여
진짜 너무 어려웠는데 그래도 글로 정리하니까 좀 구조화가 되는 듯요
끝
'AI' 카테고리의 다른 글
| 딥러닝, 임베딩, Transformer 찍먹하기 (0) | 2026.07.10 |
|---|---|
| Zero-shot/Few-shot, Pydantic (0) | 2026.07.10 |
| 기계학습 강의자료 4 openface 실습 환경세팅 + 실습 과정 (0) | 2026.07.07 |
| LPCVC 준비 2 (0) | 2026.03.30 |
| LPCVC 준비 (3) | 2026.02.22 |