Prompt Management는 LLM 애플리케이션에서 사용하는 프롬프트를 위한 중앙 집중식 레지스트리를 제공합니다. 애플리케이션 코드나 구성 파일에 프롬프트 템플릿을 하드코딩하는 대신, Agent Observability를 통해 프롬프트를 생성, 버전 관리 및 업데이트한 다음 런타임에 검색하세요.
환경별로 프롬프트를 확인하기 위한 llm_observability_read, feature_flag_config_read 및 feature_flag_environment_config_read 권한이 있는 Datadog 애플리케이션 키. Datadog에서 기존 애플리케이션 키를 선택하는 경우, 해당 키에 이러한 권한이 있는지 확인하세요.
API 또는 Python SDK를 통해 프롬프트를 관리하려면 애플리케이션 키에 llm_observability_write 및 feature_flag_config_write 권한도 필요합니다.
SDK 설치
애플리케이션에서 사용하는 Python 환경에 최신 ddtrace 패키지를 설치하거나 업그레이드하세요.
pip install --upgrade ddtrace
Python에서 관리형 프롬프트 사용
코딩 에이전트와 Prompt Management 통합
다음 프롬프트를 붙여넣어 관리형 프롬프트를 원하는 코딩 에이전트와 통합하세요.
Follow the instructions at https://docs.datadoghq.com/llm_observability/instrument/agentic.md to integrate the Datadog managed prompt <PROMPT_ID> into this application for environment <DEPLOYMENT_ENVIRONMENT> and track its use in Agent Observability.
Prompt variables: <PROMPT_VARIABLES>
When configuring the environment, use the following values:
DD_SITE=DD_ENV=<DEPLOYMENT_ENVIRONMENT>
필요시, 코딩 에이전트가 동일한 세션에서 통합을 구성하고 확인할 수 있도록 선택한 Datadog 자격 증명을 추가하세요.
Selected Datadog credentials:
DD_API_KEY=<DATADOG_API_KEY>
DD_APP_KEY=<DATADOG_APP_KEY>
Treat these values as secrets and handle them according to the linked guide. Do not repeat or expose them.
참고: 프롬프트에 API 및 애플리케이션 키를 포함하는 것은 선택 사항이며, 코딩 에이전트가 Prompt Management를 통합하는 데 필수적이지는 않습니다. 신뢰할 수 있는 코딩 에이전트 세션에서만 포함하세요.
통합이 완료되면 애플리케이션을 실행하고 수정된 LLM 흐름을 트리거하세요. 프롬프트 페이지로 돌아가 사용량을 확인하세요. 새로운 프롬프트 호출이 표시되기까지 1분 정도 걸릴 수 있습니다.
프롬프트 검색 구성
애플리케이션에서 이미 사용 중인 구성 및 시크릿 관리 워크플로를 통해 Datadog 사이트, 자격 증명 및 배포 환경을 제공하세요. 예를 들어, 애플리케이션의 환경 파일, Docker Compose 또는 Kubernetes 구성, 배포 플랫폼 또는 시크릿 관리자를 사용하세요. 런타임 시 ddtrace를 가져오기 전에 다음 환경 변수를 설정해야 합니다.
DD_ENV는 프롬프트 버전을 확인하는 데 사용되는 환경을 선택하며, 프롬프트가 배포된 환경과 일치해야 합니다.
프롬프트 검색, 형식 지정 및 사용
애플리케이션에서 이미 사용 중인 프롬프트를 폴백 프롬프트로 보존하세요. 폴백 프롬프트는 레지스트리, 환경 확인, 네트워크 또는 서버 오류가 발생할 경우 애플리케이션이 계속 작동하도록 합니다.
다음 예시는 채팅 프롬프트를 검색하고 형식을 지정한 다음, 형식화된 메시지를 OpenAI에 직접 전달합니다.
fromddtrace.llmobsimportLLMObsfromopenaiimportOpenAIdefault_messages=[{"role":"system","content":"You are a support agent for {{company}}."},{"role":"user","content":"{{question}}"},]variables={"company":"Acme Inc.","question":"How do I reset my password?",}prompt=LLMObs.get_prompt("customer-support-greeting",fallback=default_messages,)messages=prompt.format(**variables)client=OpenAI()response=client.chat.completions.create(model="gpt-4o",messages=messages,)
prompt.format()은 텍스트 프롬프트의 경우 문자열을, 채팅 프롬프트의 경우 메시지 목록을 반환합니다. 형식화된 값을 LLM 공급자 호출의 해당 텍스트 또는 메시지 파라미터에 전달하세요.
검색에 실패하고 폴백 프롬프트가 제공되지 않으면 get_prompt()가 ValueError를 발생시킵니다. 폴백 프롬프트가 인증을 대신하지는 않습니다. DD_API_KEY는 항상 필요하며, DD_ENV가 설정된 경우 DD_APP_KEY도 필요합니다.
프롬프트 구성을 사용하지 않는 경우, 애플리케이션 코드에서 프롬프트를 결합하거나 제공업체에 전달할 최종 프롬프트를 하나의 프롬프트로 관리합니다. 관리형 프롬프트를 다른 프롬프트에 포함하는 방법은 구성을 사용하여 프롬프트 재사용을 참조하세요. 프롬프트 구성은 미리 보기로 제공되고 있습니다.
형식이 지정된 값을 복사, 재구축 또는 변환하면 프롬프트 추적 메타데이터가 삭제될 수 있습니다. 예를 들어, 관리형 시스템 프롬프트를 사용자 질문과 연결하면 해당 메타데이터가 없는 새 문자열이 생성됩니다. LLMObs.annotation_context()를 사용하여 관리형 프롬프트를 결과 LLM 스팬과 연결하세요.
prompt=LLMObs.get_prompt("customer-support-system-prompt",fallback="You are a helpful support agent writing for a {{audience}} audience.",)variables={"audience":audience}system_prompt=prompt.format(**variables)combined_prompt=f"{system_prompt}\n\nUser question: {question}"withLLMObs.annotation_context(prompt=prompt.to_annotation_dict(**variables),):response=client.responses.create(model="gpt-4o",input=combined_prompt,)
to_annotation_dict()에 전달하는 것과 동일한 변수를 format()에 전달하여 추적된 프롬프트에 해당 호출에 사용된 값이 포함되도록 하세요.
annotation_context() 컨텍스트 내에서 생성된 LLM 스팬과 메타데이터를 연결하며, 스팬 자체를 생성하지는 않습니다. 자동으로 계측되지 않는 공급자의 경우, 먼저 LLM 호출을 수동으로 계측하여 LLM 스팬을 생성하세요. 명시적 annotation_context()가 자동 프롬프트 추적보다 우선합니다. 자세한 내용은 프롬프트 추적을 참조하세요.
프롬프트 생성 및 관리
Prompts UI, Python SDK 또는 API를 통해 프롬프트를 생성하고 새 버전을 게시하세요.
프롬프트 생성
추적된 프롬프트 승격
Agent Observability에서 이미 추적 중인 프롬프트를 관리형 프롬프트로 승격하려면 Prompts 페이지로 이동하여 프롬프트를 열고 Register를 클릭하세요. 그런 다음 UI에서 프롬프트를 업데이트하고 런타임에 검색할 수 있습니다.
UI에서 처음부터 만들기
Prompts 페이지로 이동하여 + New Prompt를 클릭합니다.
프롬프트 편집기에서:
하나 이상의 메시지를 추가하고 각각에 System, User 또는 Assistant 역할을 할당하세요.
{{variable_name}} 구문을 메시지에 사용하여 동적 콘텐츠를 추가하세요.
(선택 사항) 메시지 플레이스홀더 미리 보기 기능을 사용할 수 있는 경우 Add Message Placeholder를 클릭합니다. 런타임에 메시지 삽입 섹션을 참조하세요.
(선택 사항) Run을 클릭하여 샘플 값으로 프롬프트를 테스트합니다.
Save Prompt를 클릭하여 저장 대화 상자를 엽니다.
사용자 쿼리와 컨텍스트가 변수로 삽입되도록 프롬프트를 구성하세요.
저장 대화 상자에서 다음 항목을 입력하세요.
필드
설명
Prompt ID
customer-support-greeting과 같은 프롬프트의 고유 식별자입니다. 이 ID를 사용하여 LLMObs.get_prompt()로 프롬프트를 가져옵니다.
Description
이 버전에 대한 참고 사항(필요시)입니다.
Deployment
이 버전이 배포되는 환경입니다.
Create Prompt를 클릭하여 프롬프트를 레지스트리에 저장합니다.
프롬프트 업데이트, 나열 및 삭제
UI에서 설정
Prompts 페이지에서 프롬프트를 열어 다음을 수행합니다.
새 버전 만들기: Edit를 클릭하고 프롬프트 편집기에서 메시지를 업데이트하세요.
다른 환경에 버전 배포: 버전을 선택하고 해당 Deployment 환경을 업데이트하세요.
프롬프트 삭제: 프롬프트 옵션 메뉴에서 Delete을 선택하세요. 이렇게 하면 레지스트리에서 프롬프트와 해당 버전 기록이 제거됩니다.
Python SDK 사용
LLMObs.create_prompt()를 사용하여 프롬프트를 만들고 첫 번째 버전을 하나 이상의 환경에 배포하세요. env_ids 값은 환경 목록 나열 API에서 얻을 수 있는 Feature Flags 환경 ID입니다.
fromddtrace.llmobsimportLLMObschat_template=[{"role":"system","content":"You are a support agent for {{company}}."},{"role":"user","content":"{{question}}"},]created_prompt=LLMObs.create_prompt("customer-support-greeting",chat_template,env_ids=["<FEATURE_FLAG_ENVIRONMENT_ID>"],)
다른 버전을 게시하고 배포하려면 LLMObs.create_prompt_version()을 사용하세요.
관리형 프롬프트를 관리하려면 LLMObs.list_prompts()와 LLMObs.list_prompt_versions()를 사용하고, 메타데이터나 배포를 업데이트하려면 LLMObs.update_prompt()와 LLMObs.update_prompt_version()을 사용하며, 프롬프트와 해당 프롬프트의 모든 버전을 삭제하려면 LLMObs.delete_prompt()를 사용하세요.
API 사용
Prompt Management API를 사용하여 프롬프트 및 프롬프트 버전을 생성, 검색, 업데이트 및 삭제합니다. 엔드포인트 스키마, 요청 미디어 유형 및 예시는 Agent Observability API 참조를 참조하세요.
런타임에 메시지 삽입
미리 보기: 메시지 플레이스홀더는 미리 보기로 제공되고 있습니다. 액세스를 요청하려면 Datadog 지원팀 또는 고객 성공 관리자에게 문의하세요.
메시지 플레이스홀더는 런타임에 저장된 프롬프트에 대화 기록이나 도구 상호 작용을 삽입합니다. {{question}}과 같은 텍스트 변수는메시지 내의 텍스트를 대체합니다. 메시지 플레이스홀더는 전체 메시지 목록을 삽입합니다.
프롬프트 버전은 런타임에 전달하는 메시지가 아니라 플레이스홀더의 이름과 위치를 저장합니다. 프롬프트 내에서 대화 기록의 위치를 변경하려면 새 프롬프트 버전을 게시합니다. 애플리케이션 코드를 변경할 필요는 없습니다.
미리 보기 SDK 액세스: 사용하는 프로그래밍 언어에 적합한 SDK 버전을 확인하려면 Datadog 지원팀이나 고객 성공 관리자에게 문의하세요.
플레이스홀더 정의
프롬프트 편집기에서 Add Message Placeholder를 클릭하고 history와 같은 이름을 입력합니다. 위아래 화살표 버튼을 사용하여 플레이스홀더를 메시지 사이의 원하는 위치로 이동합니다. 프롬프트에 있는 텍스트 변수와 겹치지 않는 이름을 사용합니다. 저장하기 전에 편집기에 호환되는 SDK의 요구 사항이 표시됩니다.
Python SDK로 동일한 프롬프트를 만들려면 대화 기록을 삽입할 위치에 "type": "placeholder"가 포함된 항목을 추가합니다.
fromddtrace.llmobsimportLLMObsLLMObs.create_prompt("support-assistant",[{"role":"system","content":"You are a concise assistant for {{plan}} customers."},{"type":"placeholder","name":"history"},{"role":"user","content":"{{question}}"},],env_ids=["<FEATURE_FLAG_ENVIRONMENT_ID>"],)
플레이스홀더 이름인 history는 애플리케이션이 런타임에 메시지를 전달하는 데 사용하는 키입니다. 메시지 역할이 아닙니다. 설정 요구 사항 및 환경 ID에 대한 자세한 내용은 Python SDK 사용 섹션을 참조하세요.
런타임 값 제공
프롬프트를 검색한 다음 텍스트 변수와 함께 대화 기록 목록을 전달합니다. SDK는 플레이스홀더 위치에 대화 기록 메시지를 순서대로 삽입합니다.
prompt=LLMObs.get_prompt("support-assistant")variables={"plan":"enterprise","question":"Can I export the report?","history":[{"role":"user","content":"Where are reports located?"},{"role":"assistant","content":"Under Analytics."},],}messages=prompt.format(**variables)
prompt,err:=llmobs.GetPrompt(ctx,"support-assistant")iferr!=nil{returnerr}variables:=map[string]any{"plan":"enterprise","question":"Can I export the report?","history":[]map[string]any{{"role":"user","content":"Where are reports located?"},{"role":"assistant","content":"Under Analytics."},},}rendered,err:=prompt.Format(variables)iferr!=nil{returnerr}messages:=rendered.Messages
constprompt=awaittracer.llmobs.getPrompt('support-assistant')constvariables={plan:'enterprise',question:'Can I export the report?',history:[{role:'user',content:'Where are reports located?'},{role:'assistant',content:'Under Analytics.'}]}constmessages=prompt.format(variables)
결과에는 플레이스홀더 항목이 포함되지 않은 네 개의 메시지가 있습니다.
[{"role":"system","content":"You are a concise assistant for enterprise customers."},{"role":"user","content":"Where are reports located?"},{"role":"assistant","content":"Under Analytics."},{"role":"user","content":"Can I export the report?"}]
형식이 지정된 메시지를 모델 제공업체에 전달합니다. 삽입된 메시지에 {{variable}} 구문이 포함되어 있으면 SDK는 이를 리터럴 텍스트로 유지합니다.
다른 관리형 프롬프트와 동일한 프롬프트 추적 워크플로우를 사용합니다. 프롬프트 메타데이터는 런타임 값이 아닌 플레이스홀더 정의를 유지하며, 확장된 메시지에는 기존 입력 캡처 및 개인정보 보호 설정이 적용됩니다.
도구 상호 작용 포함
플레이스홀더는 도구 호출 및 도구 응답을 삽입할 수도 있습니다. 모델 제공업체의 메시지 형식을 사용합니다. 예를 들어, OpenAI Chat Completions 형식에서는 각 도구 응답의 tool_call_id를 해당 도구 호출의 id로 설정합니다.
이 값들을 prompt.Format(...)에서 반환된 메시지와 함께 모델 클라이언트에 전달하세요.
API 작성:Prompt Management API를 사용하여 프롬프트와 버전을 생성할 수도 있습니다. config를 생략하면 새 프롬프트에 대한 빈 구성이 생성되거나 새 버전에 대한 최신 구성이 상속됩니다. 지우려면 {}을 전송하세요.
프롬프트 구성을 통한 프롬프트 재사용
미리 보기: 프롬프트 구성은 미리 보기로 제공되고 있습니다. 액세스를 요청하려면 Datadog 지원팀 또는 고객 성공 관리자에게 문의하세요.
프롬프트 구성을 사용하면 한 프롬프트에 다른 프롬프트를 포함할 수 있으므로 공유 지침을 복사하지 않고도 재사용할 수 있습니다. 예를 들어, 지원 어시스턴트와 청구 어시스턴트는 동일한 응답 정책을 포함할 수 있습니다. 다음 두 가지 방법으로 다른 프롬프트를 포함할 수 있습니다.
채팅 메시지: 채팅 프롬프트의 일부 또는 전체 메시지를 포함합니다.
텍스트: 메시지 내에 텍스트 프롬프트의 내용을 삽입합니다.
각 포함 항목은 특정 버전 하나를 참조합니다. 포함된 프롬프트의 새 버전을 게시해도 이미 해당 프롬프트를 포함하고 있는 프롬프트는 변경되지 않습니다.
채팅 메시지 포함
UI에서 설정
다음 예시에서는 지원 어시스턴트 프롬프트에 공통 응답 정책을 추가합니다.
ID가 response-policy이고 System 메시지 하나가 포함된 프롬프트를 저장합니다. Answer concisely. If you do not know the answer, say so.
Prompts 페이지에서 New Prompt를 클릭합니다. 프롬프트 편집기에서 Include Prompt를 클릭하고 response-policy 버전 1을 선택한 다음 Add prompt를 클릭합니다.
포함된 프롬프트 뒤에 User 메시지({{question}}포함)를 추가합니다`. If the editor added empty messages, remove them.
Click Save프롬프트 ID로 support-assistant-composed를 입력한 다음 Create prompt를 클릭합니다.
이제 프롬프트에 다음 내용이 포함됩니다.
System: Answer concisely. If you do not know the answer, say so.
User: {{question}}
애플리케이션이 평소와 같이 프롬프트를 검색하고 형식을 지정합니다. 검색된 프롬프트에 포함된 메시지가 이미 들어 있으므로 response-policy를 별도로 검색할 필요가 없습니다.
기본적으로 포함 항목은 참조하는 프롬프트의 모든 메시지를 순서대로 추가합니다. 일부 메시지만 포함하거나, 순서를 변경하거나, 특정 메시지를 반복하려면 프롬프트 편집기에서 Included Prompt를 클릭하고 Customize messages를 선택합니다. 포함 항목을 사용자 지정해도 원본 프롬프트는 변경되지 않습니다.
API를 통한 설정
template.messages에서 include 객체를 사용하여 채팅 프롬프트의 특정 버전을 참조합니다. 이 예시에서는 버전 1이 있는 채팅 프롬프트 response-policy를 가정합니다. 이 프롬프트를 포함하는 새 프롬프트를 생성하려면 다음 JSON 본문을 POST /api/v2/llm-obs/v1/prompts에 전송합니다.
참조는 공백이나 줄 바꿈이 추가되지 않고 포함된 텍스트 그대로 해석됩니다. 항상 버전을 지정합니다. 버전을 지정하지 않으면 {{>response-style}}은 다른 프롬프트를 포함하지 않고 리터럴 텍스트로 유지됩니다. 미리 보기 기능에 대한 액세스 권한 없이 프롬프트를 생성하면 인라인 참조는 리터럴 텍스트로 유지됩니다. 이전에 저장한 조합된 프롬프트 버전은 계속 사용할 수 있습니다.
API 요청에서는 텍스트 template 또는 채팅 메시지의 content에 동일한 구문을 사용합니다.
포함 항목 검토 및 업데이트
저장된 버전에서 Prompt Template에는 직접 작성한 참조가 표시됩니다. Resolved Prompt에는 런타임 변수에 값이 입력되기 전의 확장된 메시지가 표시됩니다.
공유 정책이 변경되면 해당 Used By 탭을 사용하여 정책을 참조하는 프롬프트를 찾습니다. 해당 정책을 참조하는 프롬프트를 열고 포함 항목을 새 원본 버전으로 교체한 다음 업데이트된 프롬프트를 테스트, 저장 및 배포합니다. 기존 버전은 소스가 나중에 삭제되더라도 원래 콘텐츠를 유지합니다.
고급 사용
하나의 환경에서 여러 버전 제공
Prompt Management는 Datadog의 Feature Flags 제품을 기반으로 구축되었습니다. 각 환경은 get_prompt() 호출을 기본 버전으로 매핑하며, 타겟팅 규칙과 일치하는 호출에는 다른 버전을 제공할 수도 있습니다.
예를 들어, 타겟팅 규칙을 사용하여 production의 사용자 하위 집합에 불안정한 프롬프트 버전을 배포하면서 나머지 사용자에게는 안정적인 버전을 계속 제공할 수 있습니다.
## DD_ENV=productionprompt=LLMObs.get_prompt("my-prompt")# resolves to the stable versionprompt=LLMObs.get_prompt("my-prompt",tag="unstable")# resolves to the unstable version
이를 구성하려면 다음 단계를 따르세요.
프롬프트의 버전 목록에서 환경 위로 마우스를 가져간 다음 Targeting Rules를 클릭합니다.
Add Targeting Rule을 클릭합니다.
규칙 필터를 정의합니다. 예를 들어, 속성 tag=unstable을 전달하는 get_prompt() 호출을 일치시키고 결과 variant를 불안정한 프롬프트 버전으로 설정합니다.
규칙을 저장합니다. tag=unstable을 포함한 호출은 일치하는 버전으로 매핑되며, 그 외의 호출은 기본 버전으로 폴백됩니다.
타겟팅 규칙에서 참조하는 속성을 키워드 인수로 get_prompt()에 전달하세요. 일치하는 속성을 전달하지 않는 호출은 계속해서 환경의 기본 버전으로 매핑됩니다.
타겟팅 규칙과 관계없이 정확한 버전을 가져오려면 Select a version에 설명된 대로 version을 전달하세요.