김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.
함수 호출
호출할 수 있는 함수(기능)를 미리 설정해두면 사용자의 필요에 따라 해당 함수 이름을 호출하여 요청에 응답하는 기능
→ 프로그램 내의 함수를 직접 호출하는 것이 아니라 어떤 함수와 파라미터가 필요한지를 JSON 형식으로 응답해줌
{
"name": "get_current_weather",
"description": "주어진 위치의 현재 날씨를 가져옵니다.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "도시 또는 지역, 예) 서울",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
}
프롬프트: 날씨 알려줘
결과
{
'role': 'assistant',
'content': '어느 도시나 지역의 날씨를 알고 싶으세요?'
}
프롬프트: 서울 날씨 알려줘.
결과
{
'role': 'assistant',
'content': None,
'function_call': {
'name': 'get_current_weather',
'arguments':
'{\\n "location": "Seoul, Korea",\\n
"format": "celsius"\\n}'
}
}
함수 호출 사용 시 주의사항
프롬프트 인젝션에 취약할 수 있다.
-> 사용자의 아이디나 비밀번호 등 민감한 정보는 파라미터 설정에 넣지 않는 것이 좋음
호출 요류가 생길 수도 있다.
-> 반환되는 값을 항상 확인 후 실행해야
프롬프트 평가와 시스템
프롬프트에서 입출력 요건을 먼저 정의할 때 필요한 작업
- 답변을 위해 필요한 적절한 컨텍스트 정의 ← 컨텍스트 데이터
- 원하는 결과 추출을 위한 프롬프트 작성 ← 인스트럭션 or 사용자 입력 데이터
- 결과물의 형식을 지정 ← 출력 데이터
대부분의 LLM 애플리케이션에는 다컨텍스트, 사용자의 요청, 컨텍스트와 사용자의 요청에 따라 만들어지는 출력 샘플의 세 가지 데이터를 먼저 정리해 놓으면 프롬프트 명세가 완성
머신러닝 데이터 분류
훈련/학습 데이터 60% (학습용 데이터)
검증 데이터 20% (어떤 모델이 가장 좋은가?)
평가 데이터 20% (이 모델이 실제로 얼마나 좋은가?)
프롬프트 애플리케이션은 이미 학습이 끝난 LLM 모델 위에서 돌아가는 것이기 때문에 성능 평가를 위한 데이터만 필요
프롬프트 버전 관리
버전이 필요한 경우
- 실제 서비스 진행 뒤 문제가 생겨 롤백이 필요한 경우
- LLM 모델이 변경되어 프롬프트 재탐색이 필요한 경우
- 변경 사항 추적이 필요한 경우
메이저 버전 변경
- 출력 포맷이 변경되는 경우
- 출력 내용이나 구성이 많이 변경되는 경우
마이너 버전 변경
- 결과를 조금 더 정확하게 출력하도록 개선하는 경우
- 생성 옵션이 변경되는 경우
생성 결과 평가하기
- 질문한 대로 정확하게 값을 출력하는지 여부
- 예시 데이터와 생성 결과의 임베딩 유사도 평가
- 인간 평가
- 생성 모델로 평가
LLM 보안
ChatGPT에 입력한 데이터를 OpenAI에서 학습 데이터로 사용하지 않는다. (약관에 명시)
ChatGPT 서비스에서도 자신의 데이터를 학습 데이터로 사용하지 않도록 옵트 아웃 시킬 수 있다. (사용자가 거부 가능)
마스킹
개인 정보 등의 민감한 정보를 비식별 단어로 치환하여 보안성을 높이는 방법
- 사용자 입력과 DB에서 가져온 정보에 개인 정보가 있는지를 내부적으로 판별
- 개인 정보가 있다면 해당 정보를 제거하고 그 자리에 다른 텍스트를 끼워 넣는 방식
- 마스킹한 정보를 기반으로 프롬프트를 합성한 후 GPT API를 호출해 프롬프트를 생성
- 생성한 프롬프트로 생성 결과를 받아오면 여기에 개인 정보를 주입
LLM의 취약점
- 프롬프트 인젝션: 정교하게 제작된 프롬프트를 사용하여 필터를 우회하거나 LLM을 임의로 조작해 이전 지시 사항을 무시하거나 의도하지 않은 행동을 수행하게 만드는 경우
- 데이터 유출: LLM의 응답을 통해 민감한 정보나 기밀 등을 실수로 외부에 공개하는 경우
- 취약한 샌드박싱: 외부 자원이나 민감한 시스템에 접근할 수 있는 LLM을 적절하게 격리하지 못해 잠재적인 악용과 무단 접근에 노출되는 경우
- 인증되지 않은 코드 실행: 자연어 프롬프트를 통해 기본 시스템에서 악의적인 코드, 명령, 행동을 실행하는 경우
- LLM 생성 콘텐츠에 대한 과도한 의존: 사람의 감독 없이 LLM 생성 콘텐츠에 과도하게 의존함으로써 해로운 결과를 초래하는 문제
- 훈련 데이터 조작: 학습 데이터를 악의적으로 조작하여 LLM에 취약점을 만들거나 백도어를 심는 공격
- 인공지능의 목표와 사람의 목표 불일치: LLM의 목표와 행동을 사람의 의도나 가치에 맞지 않게 만들어 비윤리적인 결과를 초래하는 문제
- 불충분한 접근 제어: 사용자나 프로세스의 접근을 제어하거나 인증을 제대로 구현하는 메커니즘을 충분히 갖추고 있지 않아, 비인증 사용자가 LLM과 상호 작용하면서 취약점을 악용할 수 있는 문제
프롬프트 인젝션 방어 방법
- 프롬프트를 입력할 때 구분자를 사용해 사용자의 입력값 이전과 이후로 나눈다
- 설정 후 사용자 입력 이전의 프롬프트 내용에 대해서는 답변하지 말라고 지시
```구분자 안의 내용을 번역하세요.
번역할 내용:
```
다음 포맷을 사용해 입력된 내용을 일본어로 번역해주세요.
{"input"!"한국어", "outpit"."일본어"}
안녕하세요?
2. 프롬프트를 실행하기 전 인젝션 프롬프트가 존재하는지 다른 LLM으로 먼저 확인 후 실행
3. 사용자 입력과 프롬프트를 분석한 다음 각 작업을 민감도에 따라 나눔
Autonomous Agent
어떤 목표가 주어지면 스스로 작업을 생성 및 실행하고, 실행한 결과를 기반으로 다시 새로운 작업을 생성하는 과정을 반복하면서 원하는 목표에 도달할 때까지 스스로 계획을 세우고 실행하는 AI 프로그램
Collaborative Agents
- 여러 개의 작은 도메인 기능을 수행하는 에이전트를 구현
- 에이전트들을 매니징하는 형태의 상위 에이전트(매니저 에이전트)를 만들어 에이전트끼리 서로 협업하는 방식으로 더 넓은 범위의 작업을 수행하도록 만듦
Generative Agents
스탠포드 대학과 구글에서 진행한 연구
사이버상에 마을을 하나 만들고 25명의 AI 캐릭터를 살게 한 다음, 이들이 상호작용하면서 어떤 행동을 하는지 관찰한 것
어떤 생각이 더 발전되기도 하고 새로운 이벤트를 만들어 내는 등 시뮬레이션이 가능
→ 게임 업계에 큰 영향을 미칠 것으로 예상
AGI의 구현
AGI: 범용 인공지능
모든 도메인에 특정한 역할과 기능을 하는 에이전트들이 만들어지고, 해당 에이전트들을 선택적으로 사용할 수 있는 최상위 개념의 에이전트가 바로 AGI가 된다는 기대 존재
'AI' 카테고리의 다른 글
[프롬프트 엔지니어링] 프롬프트 작성 도움, 환각 줄이기, 외부 지식 주입에 대하여 (0) | 2024.12.29 |
---|---|
[프롬프트 엔지니어링] 프롬프트 엔지니어링 기법들에 대하여 (4) | 2024.11.25 |
[프롬프트 엔지니어링] AI와 LLM에 대하여 (2) | 2024.11.24 |