대규모 언어 모델을 실제 제품 백엔드에 통합하는 것은 혁신을 위한 최신 전쟁터입니다. 그러나 모든 기술 트렌드와 마찬가지로, 진정한 승자는 모든 것을 알기 위해 서두르는 사람이 아닙니다. 대신 잠시 멈춰서 반성하고 현명한 결정을 내리는 것이 중요합니다.
AI가 그 어느 때보다 접근성이 좋아졌음에도 불구하고, 그것을 사소한 작업이라고 생각하는 것은 큰 실수입니다. 이 분야는 아직 초기 단계에 있으며 기술 및 비즈니스 분야의 거의 모든 사람들이 이를 이해하는 방법을 찾으려고 노력하고 있습니다. 인터넷에는 믿을 만한 정보와 오해를 불러일으키는 과대광고가 넘쳐납니다.
믿거나 말거나, AI에 관한 모든 소문을 들을 필요는 없습니다. 한걸음 물러서서 신중하게 접근해보세요.
PHP 개발자이거나 PHP 코드베이스로 작업하는 경우 AI가 외계인 개념처럼 느껴질 수 있습니다. 클래스, 인터페이스, 메시지 대기열 및 프레임워크는 NLP, 미세 조정, 확률적 경사하강법, LoRA, RAG 및 기타 모든 전문 용어와는 별개의 세계처럼 보입니다. 알겠습니다. 소프트웨어 엔지니어링과 마찬가지로 이러한 개념을 체계적으로 배우려면 시간과 모범 사례가 필요합니다.
하지만 AI, 머신러닝, 데이터 과학은 Python이나 R 프로그래머의 영역이 아닌가요? 당신 말이 부분적으로 옳습니다. 대부분의 기초적인 기계 학습은 Python으로 수행됩니다. 그리고 솔직히 Python은 배우기에 즐겁습니다. 다재다능하고 수많은 흥미로운 프로젝트에 적용될 수 있습니다. 언어 모델 구축 및 학습부터 API를 통한 배포까지 Python이 모든 것을 다룹니다.
다시 PHP로 돌아가 보겠습니다.
걱정하지 마세요. 일반 소프트웨어 엔지니어로서 쓸모가 없어지지는 않습니다. 정반대입니다. 컨테이너화, CI/CD, 시스템 엔지니어링, 클라우드 인프라와 같은 관련 분야에 대한 이해가 점점 더 기대됨에 따라 AI는 빠르게 우리 툴킷의 또 다른 필수 기술이 되고 있습니다. 학습을 시작하기에 지금보다 더 좋은 때는 없습니다.
그렇지만 (정말로 원하지 않는 한) 처음부터 신경망 구축에 뛰어들지는 않는 것이 좋습니다. 압도당하기 쉽습니다. 대신 AI 실험의 실용적인 출발점을 보여드리겠습니다.
이 가이드에서 다룰 내용은 다음과 같습니다.
비동기식 AI 워크플로
RabbitMQ, Amazon SQS 또는 선호하는 브로커 등 메시지 대기열을 사용하여 AI 워크플로를 구현하는 방법을 보여 드리겠습니다.
즉시 생산 가능한 솔루션
AI를 통해 기본적인 비즈니스 요구 사항을 해결하는 생산 시스템에 배포된 솔루션의 실제 예를 확인하실 수 있습니다
심포니 통합
이 솔루션은 Symfony PHP 프레임워크 내에서 완벽하게 구현됩니다.
OpenAI 도구
우리는 OpenAI PHP 라이브러리와 최신 OpenAI Assistants 2.0을 사용할 것입니다.
데이터세트 구조
AI 모델을 훈련하고 평가하기 위한 데이터 세트를 구축하는 방법
OpenAI 모델 미세 조정
적절한 .jsonl 파일을 준비하고 특정 비즈니스 사용 사례에 맞게 GPT-4o-mini 모델이나 GPT 제품군의 다른 모델을 미세 조정하는 방법을 알아보세요.
OpenAI Assistant 2.0 생성 및 테스트
OpenAI Assistant를 설정하고 OpenAI Playground에서 테스트하는 방법을 이해하세요.
지식 기반
지식 기반의 개념에 대해 자세히 알아보세요. GPT가 모든 것을 알지 못하는 이유와 지식 기반에 올바른 컨텍스트를 제공하여 정확성을 크게 높이는 방법입니다.
PHP와 Symfony 통합
AI 에이전트를 Symfony 애플리케이션과 원활하게 연결하는 방법을 알아보세요.
관심이 있으신가요? 굴러가자.
우리가 해결하고 있는 문제를 자세히 살펴보겠습니다.
핵심은 무언가를 나타내는 텍스트 블록(우리의 경우 주소)을 다루고 있습니다. 목표는 구성요소를 사전 정의된 그룹으로 분류하는 것입니다.
따라서 사용자가 주소를 보내면 주소를 여러 부분으로 분할하는 JSON 구조를 반환하는 것이 목표입니다. 예:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
이것이 왜 중요합니까?
글쎄요, 이 주소는 사람, 즉 우리 고객이 입력한 것이므로 일관성이 없는 경우가 많습니다. 구조화되고 구문 분석된 데이터가 필요한 이유는 다음과 같습니다.
이를 달성하기 위해 주소를 '거리', '집', '우편번호' 등과 같은 사전 정의된 그룹으로 분리한 다음 원하는 순서로 다시 조립합니다.
정규 표현식을 사용하면 안 되는 이유는 무엇입니까?
얼핏 보면 간단해 보입니다. 신규 고객에 대해 형식을 적용하거나 고객이 일반적으로 특정 방식으로 주소를 작성한다는 것을 알고 있는 경우 정규 표현식이 합리적인 솔루션처럼 보일 수 있습니다.
그러나 루마니아어 주소의 예를 고려해 보겠습니다.
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
루마니아 주소는 복잡하고 특별한 순서 없이 작성되는 경우가 많으며 우편번호와 같은 요소가 생략되는 경우가 많습니다. 가장 정교한 정규식이라도 이러한 가변성을 안정적으로 처리하는 데 어려움을 겪습니다.
여기서 GPT-3.5 Turbo 또는 GPT-4o-mini와 같은 AI 모델이 빛을 발합니다. 정규 표현식과 같은 정적 규칙이 처리할 수 있는 것보다 훨씬 더 많은 불일치와 복잡성을 관리할 수 있습니다.
예, 우리는 기존 접근 방식을 크게 개선하는 AI 워크플로를 개발 중입니다.
모든 기계 학습 프로젝트는 데이터와 모델이라는 두 가지 필수 요소로 요약됩니다. 모델도 중요하지만 데이터가 훨씬 더 중요합니다.
모델은 사전 포장되어 테스트를 거쳐 출시되며 어떤 모델이 더 나은 성능을 발휘하는지 확인하기 위해 교체할 수 있습니다. 하지만 진정한 판도를 바꾸는 것은 우리가 모델에 제공하는 데이터의 품질입니다.
머신러닝에서 데이터의 역할
일반적으로 우리는 데이터 세트를 2~3개 부분으로 나눕니다.
이 프로젝트에서는 주소를 구성 요소로 분할하여 분류 작업을 수행하려고 합니다. GPT와 같은 대규모 언어 모델(LLM)로 좋은 결과를 얻으려면 학습 데이터 세트에 최소 100개의 예가 필요합니다.
데이터세트의 원시 형식은 크게 중요하지 않지만 직관적이고 사용하기 쉬운 구조를 선택했습니다.
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
예:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
보시다시피 목표는 입력 주소를 기반으로 구조화된 JSON 응답을 생성하는 것입니다.
먼저 OpenAI API 계정이 필요합니다. 이는 간단한 과정이므로 초기 자금을 추가하는 것이 좋습니다. $10 또는 $20이면 시작하기에 충분합니다. OpenAI는 편리한 선불 구독 모델을 사용하므로 지출을 완벽하게 제어할 수 있습니다.
여기에서 계정 결제를 관리할 수 있습니다.
OpenAI 플레이그라운드 탐색
계정이 설정되면 OpenAI Playground로 이동하세요.
잠시 시간을 내어 인터페이스에 익숙해지세요. 준비가 되면 왼쪽 메뉴에서 "도우미" 섹션을 찾으세요.
여기서 맞춤형 GPT 인스턴스를 생성할 것입니다.
GPT 도우미 맞춤설정
우리는 두 단계에 걸쳐 특정 요구 사항을 충족하도록 GPT 도우미를 맞춤화할 예정입니다.
예시를 포함한 자세한 시스템 지침
이 단계는 솔루션이 작동하는지 신속하게 테스트하고 검증하는 데 도움이 됩니다. 결과를 가장 빠르게 확인할 수 있는 방법입니다.
지식 기반을 통한 미세 조정(간단한 RAG)
초기 결과에 만족하면 모델을 미세 조정합니다. 이 프로세스를 사용하면 모든 프롬프트에서 광범위한 예시를 제공해야 할 필요성이 줄어들고 결과적으로 추론 시간(모델이 API를 통해 응답하는 데 걸리는 시간)이 줄어듭니다.
두 단계를 결합하면 가장 정확하고 효율적인 결과를 얻을 수 있습니다.
자, 시작해 보겠습니다.
명명된 엔터티 인식 시스템의 경우 구조화된 JSON 응답을 일관되게 출력하는 모델이 필요합니다. 이를 달성하려면 사려 깊은 시스템 프롬프트를 작성하는 것이 중요합니다.
우리가 중점적으로 다룰 내용은 다음과 같습니다.
"퓨샷" 기술은 이 작업에 대한 강력한 접근 방식입니다. 이는 원하는 입출력 관계에 대한 몇 가지 예를 모델에 제공함으로써 작동합니다. 이러한 예를 통해 모델은 이전에 볼 수 없었던 입력을 일반화하고 처리할 수 있습니다.
퓨샷 프롬프트의 핵심 요소:
프롬프트는 여러 부분으로 구성되어 있으며 최상의 결과를 얻으려면 신중하게 구성해야 합니다. 정확한 순서는 다를 수 있지만 다음 섹션을 반드시 포함해야 합니다.
프롬프트의 첫 번째 부분에서는 모델이 달성할 것으로 기대하는 것에 대한 일반적인 개요를 제공합니다.
예를 들어 이 사용 사례에서는 입력된 루마니아어 주소가 철자 오류와 잘못된 형식을 포함할 수 있습니다. 이러한 컨텍스트는 모델의 단계를 설정하고 모델이 처리할 데이터 종류를 설명하므로 필수적입니다.
작업을 정의한 후 출력 형식을 지정하는 방법을 AI에 안내합니다.
여기에서는 모델이 입력에서 각 키-값 쌍을 파생하는 방법을 포함하여 JSON 구조에 대해 자세히 설명합니다. 기대치를 명확히 하기 위해 예시가 포함되어 있습니다. 또한 유효한 JSON을 보장하기 위해 모든 특수 문자가 올바르게 이스케이프됩니다.
'퓨샷' 기법의 핵심이 그 예입니다. 관련성이 높은 예시를 제공할수록 모델 성능이 향상됩니다.
GPT의 광범위한 컨텍스트 창(최대 16,000개 토큰) 덕분에 많은 예시를 포함할 수 있습니다.
예제 세트를 구축하려면:
기본 프롬프트로 시작하여 모델의 출력을 수동으로 평가합니다.
출력에 오류가 있으면 오류를 수정하고 수정된 버전을 예제 세트에 추가하세요.
이러한 반복 프로세스는 시간이 지남에 따라 어시스턴트의 성능을 향상시킵니다.
어시스턴트는 실수를 할 수밖에 없습니다. 때로는 같은 오류가 반복적으로 발생하는 경우도 있습니다.
이 문제를 해결하려면 메시지에 명확하고 정중한 정정 정보를 포함하세요. 명확하게 설명하세요:
어시스턴트는 어떤 실수를 저지르고 있나요.
대신 출력에서 기대하는 것
이 피드백은 모델이 동작을 조정하고 더 나은 결과를 생성하는 데 도움이 됩니다.
이제 개념 증명 퓨샷 솔루션에 대한 초기 프롬프트를 만들었으므로 어시스턴트를 구성하고 테스트할 차례입니다.
1단계
2단계: 어시스턴트 구성
3단계: 적합한 모델 선택
이 프로젝트에서 GPT-4o-mini를 선택한 이유는 다음과 같습니다.
즉, 항상 정확성과 비용 간의 균형을 기준으로 모델을 선택해야 합니다. 벤치마크를 실행하거나 검색하여 특정 작업에 가장 적합한 것이 무엇인지 결정하세요.
초기 구성이 완료되면 이제 Assistant 생성기에서 직접 출력 스키마를 지정할 수 있습니다.
1단계: "생성" 옵션 사용
스키마를 수동으로 생성하는 대신 보조 생성자가 제공하는 "생성" 옵션을 사용했습니다. 방법은 다음과 같습니다.
이 도구는 구조와 일치하는 스키마를 자동으로 생성하는 데 탁월한 성능을 발휘합니다.
--
일관되고 예측 가능한 응답을 보장하려면 온도를 최대한 낮게 설정하세요.
온도란 무엇인가요?
온도는 모델 반응의 무작위성을 제어합니다. 온도 값이 낮다는 것은 모델이 더 예측 가능하고 결정적인 출력을 생성한다는 것을 의미합니다.
우리의 사용 사례에서는 이것이 바로 우리가 원하는 것입니다. 입력과 동일한 주소가 주어지면 모델은 항상 동일하고 올바른 응답을 반환해야 합니다. 신뢰할 수 있는 결과를 얻으려면 일관성이 중요합니다.
모든 매개변수가 준비되면 플레이그라운드로 가서 솔루션을 테스트해 보세요.
Playground는 어시스턴트를 사용할 수 있는 콘솔을 제공합니다. 여기서부터 재미가 시작됩니다. 기본 솔루션을 엄격하게 테스트하여 다음을 발견할 수 있습니다.
이러한 결과는 프롬프트의 수정 정보 섹션을 개선하여 어시스턴트를 더욱 강력하게 만드는 데 도움이 됩니다.
다음은 수동 테스트 결과의 예입니다.
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
수동 테스트가 왜 중요한가요?
전통적인 실습 테스트는 신뢰할 수 있는 솔루션 구축의 기초입니다. 모델의 출력을 수동으로 평가하면 문제를 빠르게 발견하고 해결 방법을 이해할 수 있습니다. 자동화는 나중에 이루어지겠지만 수동 테스트는 확실한 개념 증명을 만드는 데 매우 중요한 단계입니다.
이제 모든 것을 PHP Symfony 애플리케이션에 통합할 차례입니다. 설정은 간단하며 고전적인 비동기식 아키텍처를 따릅니다.
다음은 흐름 분석입니다.
1.프런트엔드 상호작용
일반적으로 여기에 있는 것은 메시지 대기열을 사용한 고전적인 비동기 설정입니다. Docker 컨테이너 내에서 실행되는 Symfony 애플리케이션 인스턴스가 2개 있습니다. 첫 번째는 프런트엔드 클라이언트와 상호작용하는 것입니다.
예를 들어 고객이 다음을 입력하는 경우:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
애플리케이션은 입력 주소를 처리하고 이를 메시지 개체로 패키징합니다.
그런 다음 Message 객체는 Symfony Messenger Envelope 인스턴스로 래핑됩니다. 메시지는 처리를 위한 추가 메타데이터와 함께 JSON 형식으로 직렬화됩니다.
Symfony Messenger는 비동기 작업을 처리하는 데 적합합니다. 이를 통해 OpenAI API 호출과 같이 시간이 많이 걸리는 작업을 백그라운드 프로세스로 오프로드할 수 있습니다.
이 접근 방식은 다음을 보장합니다.
다음은 우리 시스템에 사용되는 메시지 클래스입니다.
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
애플리케이션은 amqp PHP 확장을 사용하여 RabbitMQ 인스턴스에 연결됩니다. 이를 설정하려면 메신저.yaml 구성 파일에서 전송 및 메시지 바인딩을 정의해야 합니다.
자세한 지침은 공식 Symfony Messenger 문서를 참조하세요.
Symfony 메신저 전송 구성
문서: https://symfony.com/doc/current/messenger.html#transport-configuration
메시지가 브로커(예: RabbitMQ, AmazonMQ 또는 AWS SQS)로 푸시되면 애플리케이션의 두 번째 인스턴스에서 메시지를 선택합니다. 이 인스턴스는 아키텍처 스키마에 3으로 표시된 대로 메신저 데몬을 실행하여 메시지를 소비합니다.
소비 프로세스는 다음을 실행하여 처리됩니다.
빈/콘솔 메신저:소비
과정대로 진행 중입니다.
데몬은 구성된 대기열에서 메시지를 선택하여 해당 메시지 클래스로 다시 역직렬화한 다음 처리를 위해 메시지 처리기로 전달합니다.
OpenAI Assistant와의 상호작용이 발생하는 메시지 핸들러는 다음과 같습니다.
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
핸들러 핵심 포인트
로깅
추적성 및 디버깅을 위해 처리 시작을 기록합니다.
정규화 서비스
OpenAIAddressNormalizationService가 호출되어 Assistant를 통해 입력된 주소를 처리합니다.
끈기
정규화된 주소는 Doctrine의 EntityManager를 사용하여 데이터베이스에 저장됩니다.
메시지 핸들러는 표준 Symfony 코드처럼 보일 수 있지만 핵심은 다음 줄에 있습니다.
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
이 서비스는 지정된 PHP 라이브러리를 통해 OpenAI와 상호작용하는 역할을 담당합니다.
OpenAI PHP 클라이언트
PHP 클라이언트를 활용한 서비스 구현을 살펴보겠습니다.
OpenAIAddressNormalizationService의 전체 구현은 다음과 같습니다.
input: STRADA EREMIA GRIGORESCU, NR.11 BL.45B,SC.B NR 11/38, 107065 PLOIESTI output: {{"street": "Eremia Grigorescu", "house_number": "11", "flat_number": "38", "block": "45B", "staircase": "45B", floor: "", "apartment": "", "landmark": "", "postcode": "107065", "county": "Prahova", 'commune': '', 'village': '', "city" "Ploiesti"}}
openai-php/client 라이브러리를 사용하여 추론(또는 완료)(기본적으로 GPT의 응답)을 얻는 워크플로는 세 가지 주요 단계를 따릅니다.
첫 번째 단계는 OpenAI 클라이언트를 설정하고 구성된 어시스턴트를 검색하는 것입니다.
INPUT: BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124 OUTPUT: { "street": "Bdul 21 Decembrie 1989", "house": "93", "flat": "50", "block": "", "staircase": "", "floor": "", "apartment": "", "landmark": "", "intercom": "", "postcode": "400124", "county": "Cluj", "commune": "", "village": "", "city": "Cluj" }
클라이언트 초기화: OpenAI::client() 메서드는 API 키와 조직 ID를 사용하여 새 클라이언트를 생성합니다.
보조 검색: 검색() 메서드는 작업에 대해 구성된 특정 보조 인스턴스에 연결되며 고유 ID로 식별됩니다.
클라이언트와 어시스턴트가 초기화되면 스레드를 생성하고 실행하여 상호 작용을 시작할 수 있습니다. 스레드는 사용자와 어시스턴트 간의 메시지 교환을 처리하는 통신 파이프라인 역할을 합니다.
스레드가 시작되는 방법은 다음과 같습니다.
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
스레드를 시작한 후 애플리케이션이 응답을 처리합니다. OpenAI 프로세스가 즉시 완료되지 않을 수 있으므로 '완료'로 표시될 때까지 스레드 상태를 폴링해야 합니다.
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
폴링: 애플리케이션은 스레드 상태(대기 중 또는 진행 중)를 반복적으로 확인합니다. 상태가 '완료'로 변경되면 스레드에 최종 출력이 포함됩니다.
스레드가 완료되면 애플리케이션은 응답 메시지를 검색하여 정규화된 주소를 추출합니다.
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
정규화된 주소는 이제 즉시 사용하기 위해 프런트엔드 클라이언트로 반환되거나 향후 처리를 위해 CustomerAddressNormalized와 같은 구조화된 엔터티로 데이터베이스에 저장될 수 있습니다.
이 설정을 실행하면 명명된 엔터티 인식 및 기타 분류 또는 생성 작업을 위해 OpenAI에서 구조화된 출력을 추출하고 저장할 수 있습니다.
어떤 경우에는 기본적인 AI 솔루션만으로는 충분하지 않습니다. 규정 준수 및 비즈니스 요구 사항에 따라 높은 정확도가 요구되는 경우 출력이 사실이고 신뢰할 수 있는지 확인하기 위해 더욱 노력해야 합니다.
예를 들어 JSON 구조를 생성할 때 해당 내용이 현실과 일치하는지 보장해야 합니다. 일반적인 위험은 제공된 우편번호를 기반으로 장소를 만드는 것과 같은 정보를 환각시키는 모델입니다. 이는 특히 위험이 큰 환경에서 심각한 문제를 일으킬 수 있습니다.
지식 기반을 통한 Ground Truth
환각을 제거하고 사실의 정확성을 보장하려면 어시스턴트에 실제 지식 기반을 제공해야 합니다. 이는 모델에 대한 최종 참조 역할을 하여 추론 중에 정확한 정보를 사용하도록 보장합니다.
나의 접근 방식: 우편 번호 지식 기반
저는 루마니아의 모든 우편번호에 대한 전체 경계를 포함하는 간단한(약 12MB 정도의 꽤 큰) JSON 파일을 만들었습니다. 이 사전과 같은 구조는 다음을 제공합니다.
우편번호: 입력값입니다.
확인된 정보: 해당 시, 군, 전체 지명 등의 사실입니다.
이 기술 자료는 명명된 엔터티 인식을 수행할 때 도우미의 참조 지점 역할을 합니다.
지식베이스 구조
다음은 지식 베이스 JSON 구조의 예시 스니펫입니다.
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
지식창고가 준비되었으면 이제 어시스턴트에게 지식창고를 효과적으로 사용하도록 지시할 차례입니다. 이를 프롬프트에 직접 포함할 수 있지만 이 접근 방식은 토큰 사용량과 비용을 증가시킵니다. 미세 조정을 소개하기에 좋은 순간입니다.
미세 조정에는 사전 학습된 모델의 가장 바깥쪽 레이어(특히 가중치 행렬)를 수정하여 특정 작업에 맞게 조정하는 작업이 포함됩니다. 우리의 경우 NER(Named Entity Recognition)가 완벽한 후보입니다.
세밀하게 조정된 모델:
주요 목표는 모델이 처리할 실제 데이터의 뉘앙스와 더욱 밀접하게 일치하도록 하는 것입니다. 도메인별 데이터에 대한 교육을 통해 모델은 적절한 응답을 더 잘 이해하고 생성할 수 있습니다. 또한 애플리케이션에 의한 후처리 또는 오류 수정의 필요성도 줄어듭니다.
모델을 미세 조정하려면 OpenAI에서 요구하는 대로 .jsonl(JSON Lines) 형식의 올바른 형식의 데이터세트가 필요합니다. 데이터 세트의 각 항목에는 다음이 포함됩니다.
이 데이터 세트는 어시스턴트에 도메인별 예를 제공하여 향후 유사한 프롬프트에 응답하는 방법을 학습할 수 있도록 합니다.
다음은 세부 조정 항목을 구성하는 방법의 예입니다.
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
루마니아어 주소 처리 사례를 예로 들어 .jsonl 파일의 미세 조정 항목 구조를 분석해 보겠습니다.
각 항목은 다음을 요약하여 사용자와 어시스턴트 간의 실제 상호작용을 시뮬레이션하도록 설계되었습니다.
이 접근 방식은 모델이 실제 상황에서 원하는 동작을 학습하는 데 도움이 됩니다.
1. 시스템 역할 메시지
어시스턴트의 기능과 기능 범위를 설명하고 거리 이름, 집 번호, 우편번호 등 어시스턴트가 인식하고 추출해야 하는 항목 유형에 대한 기대치를 설정합니다.
예: 시스템은 어시스턴트가 루마니아어 주소에 대한 명명된 엔터티 인식 모델로 작동하도록 설계되어 추출하고 분류해야 하는 구성 요소를 자세히 설명한다고 설명합니다.
2. 사용자 역할 메시지
3. 보조 역할 메시지
교육 파일을 생성한 후 다음 단계는 검증 파일을 준비하는 것입니다. 이 파일은 실제 데이터에 대해 미세 조정된 도우미의 정확성을 평가합니다. 구조는 트레이닝 파일과 유사하므로 두 파일 생성을 자동화하는 것이 더 간단합니다.
검증 파일은 모델의 일반화 기능을 테스트하도록 설계되었습니다. 이는 잘 조정된 어시스턴트가 익숙하지 않거나 까다로운 예제에 직면하더라도 새로운 입력을 처리하고 일관되게 수행할 수 있도록 보장합니다.
시스템 메시지:
훈련 과정의 일관성을 유지하려면 시스템 메시지가 훈련 파일에 사용된 메시지와 동일해야 합니다.
사용자 메시지:
훈련 파일에 포함되지 않은 새 입력(예: 주소)을 도입합니다. 새로운 예는 현실적이고 특정 분야에 국한되어야 하며 사소한 오류나 복잡성을 포함하여 모델에 도전해야 합니다.
어시스턴트 메시지:
새로운 사용자 입력에 대해 예상되는 구조화된 응답을 제공합니다.
이는 모델의 정확성을 검증하는 기준이 됩니다.
교육 및 검증 파일 생성을 간소화하기 위해 자동화 스크립트를 사용할 수 있습니다. 이 스크립트는 입력 데이터 세트를 기반으로 올바른 형식의 .jsonl 파일을 생성합니다.
교육 및 검증 파일을 생성하는 스크립트가 포함된 저장소를 방문하세요.
자동화된 .jsonl 생성 스크립트
미세 조정 자동화의 Python 버전입니다. PHP 버전이 곧 출시됩니다.
검증이 중요한 이유
원하는 경우 OpenAI의 그래픽 사용자 인터페이스(GUI)를 사용하여 어시스턴트를 수동으로 미세 조정할 수 있습니다. 교육 및 검증 파일을 모두 준비한 후 다음 단계에 따라 시작하세요.
1단계: 미세 조정 마법사에 액세스
2단계: 미세 조정 구성
미세 조정 메뉴에서 다음 설정을 업데이트하세요.
3단계: 미세 조정 프로세스 모니터링
미세 조정 프로세스가 시작되면 미세 조정 대시보드에서 진행 상황을 추적할 수 있습니다.
대시보드는 실시간 업데이트를 제공하고 교육 과정을 모니터링하고 평가하는 데 도움이 되는 여러 지표를 표시합니다.
이해해야 할 주요 지표
훈련 손실 모델이 훈련 데이터에 얼마나 잘 맞는지 측정합니다. 훈련 손실이 낮다는 것은 모델이 데이터 세트 내의 패턴을 효과적으로 학습하고 있음을 나타냅니다.
전체 검증 손실 검증 데이터 세트에서 확인되지 않은 데이터에 대한 성능을 나타냅니다. 검증 손실이 낮다는 것은 모델이 새로운 입력에 대해 잘 일반화된다는 것을 의미합니다.
단계 및 시간 훈련 단계는 데이터 배치를 기반으로 모델 가중치가 업데이트되는 반복 횟수입니다.
타임스탬프는 각 단계가 처리된 시간을 나타내므로 훈련 기간과 평가 간격을 모니터링하는 데 도움이 됩니다.
측정항목 해석
아래 지표를 모니터링하면 미세 조정 프로세스가 올바르게 수렴되고 있는지 또는 조정이 필요한지 판단하는 데 도움이 됩니다.
과소적합: 두 손실이 모두 높게 유지될 때 발생하며 모델이 효과적으로 학습하지 않음을 나타냅니다.
어시스턴트를 교육하고 미세 조정했다면 이제 어시스턴트를 애플리케이션에 통합하고 성능 평가를 시작할 차례입니다.
간단하게 시작하세요.
Assistants Playground에서 또는 애플리케이션 내에서 직접 수동 테스트를 시작하세요. 이 단계에서는 평가를 지나치게 복잡하게 하지 마십시오. 기본 사항이 예상대로 작동하는지 확인하는 데 집중하세요.
예를 들어, 다음과 같이 Google 스프레드시트와 같은 간단한 도구를 사용하여 입력과 출력을 수동으로 비교할 수 있습니다.
이것이 첫 번째 단계입니다.
AI 및 ML 솔루션은 성능이 일관되게 유지되도록 지속적인 평가가 필요합니다. 명명된 엔터티 인식과 같은 작업의 경우 Visual Studio Code용 PromptFlow 확장과 같은 자동화된 도구를 사용하면 테스트 및 검증을 간소화하는 데 도움이 될 수 있습니다.
참고자료
OpenAI 미세 조정 문서
심포니 메신저 문서
OpenAI PHP 클라이언트 라이브러리
VS Code용 PromptFlow 확장
감사합니다!
시간을 내어 이 가이드를 살펴봐주셔서 감사합니다! 이것이 AI 기반 솔루션을 구축하고 미세 조정할 수 있는 견고한 기반을 제공하기를 바랍니다. 질문이나 제안 사항이 있으면 언제든지 연락하거나 댓글을 남겨주세요.
행복한 코딩을 하시고 AI 프로젝트에 행운이 있기를 바랍니다! ?
위 내용은 PHP/Symfony 7에서 명명된 엔터티 인식을 위해 OpenAI 도우미 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!