모델 폐기와 마이그레이션
제공자가 모델 종료를 발표하면 Palantir가 영향받는 사용자에게 알리고 Upgrade Assistant에서 관련 리소스를 표시합니다. 권장 대체 모델과 이전 기한을 확인하고 종료 전에 업무를 옮겨야 합니다.
Brownout과 종료 오류
Brownout은 종료 예정 모델의 접근을 일시적으로 제한하는 기간입니다. 단계 수, 시작일과 지속 시간은 모델별 Upgrade Assistant 설명에 있습니다. 일반적인 불안정성을 숨기는 재시도 대상으로만 취급하지 말고 이전 일정을 확인해야 합니다.
Brownout 중에는 다음처럼 NOT_FOUND, LanguageModelService:LanguageModelNotAvailable과 제한 시간 범위를 포함한 오류가 발생합니다. 꺾쇠 값은 오류마다 달라지는 식별자와 시각을 나타냅니다.
{
"errorCode": "NOT_FOUND",
"errorName": "LanguageModelService:LanguageModelNotAvailable",
"errorInstanceId": "<error instance id>",
"parameters": {
"safeParams": "{languageModelRid=<language model rid>, deprecationDate=<deprecation date>, brownoutStart=<brown-out start>, brownoutEnd=<brown-out end>}",
"unsafeParams": "{}",
"message": "Unable to use model: language model is in planned deprecation and is currently under a brown-out"
}
}
제공자의 폐기일 이후에는 대체 모델로 옮기기 전까지 다음 오류가 발생합니다.
{
"errorCode": "NOT_FOUND",
"errorName": "LanguageModelService:LanguageModelNotAvailable",
"errorInstanceId": "<error instance id>",
"parameters": {
"safeParams": "{languageModelRid=<language model rid>, deprecationDate=<deprecation date>}",
"unsafeParams": "{}",
"message": "Unable to use model: language model is deprecated"
}
}
영향 리소스 찾기
Upgrade Assistant의 Active upgrades에서 모델 폐기 항목을 열고 Resources를 확인합니다.
종료 대상 모델을 호출하면 PENDING으로 표시합니다. 다른 모델을 호출했고 종료 대상의 마지막 호출 후 24시간이 지나면 COMPLETED가 됩니다. 이후 구모델을 다시 호출하면 PENDING으로 돌아갈 수 있습니다. 함수 변경 후 Workshop이 이전 함수 버전을 계속 쓰지 않도록 갱신해야 합니다.
이전 기간에 실행하지 않은 리소스는 종료 모델을 구성하고 있어도 목록에 나타나지 않습니다. 빌드하지 않은 파이프라인 등이 해당합니다. 운영 리소스 목록과 계보 도구로 비활성 업무도 확인합니다.
리소스를 열어 모델이 직접 구성되어 있는지, 상위 함수나 변환이 호출하는지 찾습니다. 영향을 받는 리소스의 보기 및 편집 권한이 있어야 조사와 변경을 수행할 수 있습니다. 대체 후보는 Upgrade Assistant에서 확인하고 AIP Evals로 업무 적합성을 비교합니다.
모델 선택기
Pipeline Builder, Chatbot Studio, Evals, Logic, Workshop, Quiver, Marketplace, Code Workspaces는 모델 선택기를 지원합니다. 종료 대상은 경고와 Sunset 표지가 표시됩니다. 같은 선택기에서 대체 모델을 고릅니다.
Pipeline Builder
Upgrade Assistant는 개별 노드 대신 파이프라인 전체로 연결합니다. 그래프 오른쪽 위 검색에서 use LLM을 입력하면 모든 해당 노드가 결과와 그래프 색상으로 표시됩니다.
각 결과를 선택하고 노드를 오른쪽 클릭하여 Edit를 엽니다. Model 경고가 있으면 Show configurations > Model type에서 대체 모델을 선택합니다. 모든 Use LLM 노드를 확인한 뒤 저장, 배포하고 파이프라인을 다시 빌드합니다.
Workshop의 함수와 위젯
편집 모드의 Overview > Capabilities > Functions에서 사용 함수를 확인합니다. 함수를 선택하여 원본 리소스를 열고 모델을 바꾼 뒤 저장 및 새 버전을 게시합니다.
다시 Workshop의 함수 목록에서 Bulk update version으로 모든 관련 변수와 위젯의 함수 버전을 최신으로 바꿉니다. 목록의 모든 함수를 확인합니다.
위젯별 모델 위치는 다음과 같습니다.
- AIP Chatbot은 연결한 챗봇을 Studio에서 편집하고 모델을 바꾼 뒤 저장 및 게시합니다.
- AIP generated content의
Direct to LLM또는LLM via prompt function은 위젯 선택기에서 바꿉니다.Logic방식은 상위 Logic 함수를 바꿉니다.
- Free-form analysis는
AIP options를 켜고Enabled에서 모델을 선택합니다.
- Logic - Chain of thought는 Overview의 함수 목록에서 원본 함수를 찾아 바꿉니다.
변경 후 Workshop 모듈도 저장하고 게시합니다.
코드 기반 마이그레이션
Upgrade Assistant는 정확한 코드 파일 대신 저장소, 워크스페이스 또는 하위 소비 리소스를 표시할 수 있습니다. 저장소 전체에서 구모델 참조를 찾아 바꾸고 필요하면 브랜치를 병합하여 상위 함수 또는 변환에 반영합니다.
다음 GPT-4.5에서 GPT-4.1로의 변경은 마이그레이션 형태를 설명하는 예시입니다. 현재 업무에 권장되는 모델은 실제 Upgrade Assistant와 Catalog에서 확인합니다. 데이터셋 식별자는 설명용 값이며 코드 예제의 원래 언어별 호출 규격을 유지합니다.
TypeScript v1
Legacy 모델 import 방식은 import와 모든 호출 지점의 모델 이름을 바꿔야 합니다.
import { Function } from "@foundry/functions-api"
// A deprecated model is imported
import { GPT_4_5 } from "@foundry/models-api/language-models"
/**
* Used to send a text completion request to the model based on user input
* @param {string} userInput - Text input to send to model
*/
export class MyFunctions {
@Function()
public async createChatCompletion(userInput: string): Promise<string | undefined> {
// Deprecated model usage
const response = await GPT_4_5.createChatCompletion({
params: {
"temperature": 0,
"maxTokens": 1000,
},
messages: [{ role: "USER", contents: [{ text: userInput }], }],
});
return response.choices[0].message.content;
}
}
변경 후에는 새 import와 호출을 함께 사용합니다.
import { Function } from "@foundry/functions-api"
// Import a new model
import { GPT_4_1 } from "@foundry/models-api/language-models"
/**
* Used to send a text completion request to the model based on user input
* @param {string} userInput - Text input to send to model
*/
export class MyFunctions {
@Function()
public async createChatCompletion(userInput: string): Promise<string | undefined> {
// Replace usage of the deprecated model with the new model.
const response = await GPT_4_1.createChatCompletion({
params: {
"temperature": 0,
"maxTokens": 1000,
},
messages: [{ role: "USER", contents: [{ text: userInput }], }],
});
return response.choices[0].message.content;
}
}
TypeScript v2
openai는 기본 설치되지 않으므로 Libraries에서 설치합니다. v2는 프록시 엔드포인트를 호출하고 Resource imports > Platform SDK의 모델 별칭을 통해 RID를 선택합니다. 요청 매개변수는 v1의 params 객체가 아니라 프록시 규격입니다.
import { PlatformClient } from "@osdk/client";
import OpenAI from "openai";
import { Aliases } from "@osdk/functions";
import { getFoundryToken, getOpenAiBaseUrl, createFetch } from "@osdk/language-models";
export default async function createChatCompletion(client: PlatformClient, userInput: string): Promise<string> {
const oaiClient = new OpenAI({
apiKey: await getFoundryToken(client),
baseURL: getOpenAiBaseUrl(client),
fetch: createFetch(client),
});
const completion = await oaiClient.chat.completions.create({
// Deprecated model usage through its alias
model: Aliases.model("gpt45").rid,
messages: [
{ role: "user", content: userInput },
],
max_completion_tokens: 1000,
});
return completion.choices[0]?.message.content ?? "";
}
새 모델을 가져오면 생성되는 별칭을 확인하고 Aliases.model()의 참조를 바꿉니다. 예시에서는 gpt45를 gpt41로 바꿉니다.
import { PlatformClient } from "@osdk/client";
import OpenAI from "openai";
import { Aliases } from "@osdk/functions";
import { getFoundryToken, getOpenAiBaseUrl, createFetch } from "@osdk/language-models";
export default async function createChatCompletion(client: PlatformClient, userInput: string): Promise<string> {
const oaiClient = new OpenAI({
apiKey: await getFoundryToken(client),
baseURL: getOpenAiBaseUrl(client),
fetch: createFetch(client),
});
const completion = await oaiClient.chat.completions.create({
// Reference the alias for the substitute model.
model: Aliases.model("gpt41").rid,
messages: [
{ role: "user", content: userInput },
],
max_completion_tokens: 1000,
});
return completion.choices[0]?.message.content ?? "";
}
Python 변환
모델 입력에 지정한 RID를 바꿉니다. 다음 예시는 리뷰 감정을 계산하는 변환의 변경 전후입니다.
from transforms.api import transform, Input, Output
from palantir_models.transforms import OpenAiGptChatLanguageModelInput
from palantir_models.models import OpenAiGptChatLanguageModel
from language_model_service_api.languagemodelservice_api_completion_v3 import GptChatCompletionRequest
from language_model_service_api.languagemodelservice_api import ChatMessage, ChatMessageRole
@transform(
reviews=Input("Input Dataset Rid"),
# Deprecated model usage
model=OpenAiGptChatLanguageModelInput("ri.language-model-service..language-model.gpt-4-5"),
output=Output("Output dataset rid or path"),
)
def compute_sentiment(ctx, reviews, model: OpenAiGptChatLanguageModel, output):
def get_completions(review_content: str) -> str:
system_prompt = "Take the following review determine the sentiment of the review"
request = GptChatCompletionRequest(
[ChatMessage(ChatMessageRole.SYSTEM, system_prompt), ChatMessage(ChatMessageRole.USER, review_content)]
)
resp = model.create_chat_completion(request)
return resp.choices[0].message.content
reviews_df = reviews.pandas()
reviews_df['sentiment'] = reviews_df['review_content'].apply(get_completions)
out_df = ctx.spark_session.createDataFrame(reviews_df)
return output.write_dataframe(out_df)
from transforms.api import transform, Input, Output
from palantir_models.transforms import OpenAiGptChatLanguageModelInput
from palantir_models.models import OpenAiGptChatLanguageModel
from language_model_service_api.languagemodelservice_api_completion_v3 import GptChatCompletionRequest
from language_model_service_api.languagemodelservice_api import ChatMessage, ChatMessageRole
@transform(
reviews=Input("Input Dataset Rid"),
# Replace usage of the deprecated model with the new model.
model=OpenAiGptChatLanguageModelInput("ri.language-model-service..language-model.gpt-4-1"),
output=Output("Output dataset rid or path"),
)
def compute_sentiment(ctx, reviews, model: OpenAiGptChatLanguageModel, output):
def get_completions(review_content: str) -> str:
system_prompt = "Take the following review determine the sentiment of the review"
request = GptChatCompletionRequest(
[ChatMessage(ChatMessageRole.SYSTEM, system_prompt), ChatMessage(ChatMessageRole.USER, review_content)]
)
resp = model.create_chat_completion(request)
return resp.choices[0].message.content
reviews_df = reviews.pandas()
reviews_df['sentiment'] = reviews_df['review_content'].apply(get_completions)
out_df = ctx.spark_session.createDataFrame(reviews_df)
return output.write_dataframe(out_df)
Quiver와 의존성 조사
Quiver 분석 사이드바의 설정에서 AIP Settings 모델 선택기를 사용합니다.
Workshop이나 함수 저장소에서 Cmd+I(macOS), Ctrl+I(Windows)로 Workflow Lineage를 열면 기반 객체, 액션, 함수와 모델 연결을 확인합니다. 종료 모델에는 경고가 표시됩니다. 함수를 사용하는 다른 Workshop 및 OSDK 앱도 찾아 영향 범위를 확인할 수 있습니다.
Workflow Lineage는 함수 버전을 한 앱 또는 모든 종속 Workshop 앱에서 일괄 갱신할 수 있고 여러 Logic의 모델도 일괄 교체할 수 있습니다.
Ontology Manager의 Functions에서 해당 함수를 찾아 Usage history를 보면 소비 리소스 목록이 나옵니다. 버전으로 필터링하여 구버전 사용처를 찾고 각각 갱신합니다.