Oracle Cloud Infrastructure Data Science LLM 통합

Oracle Cloud Infrastructure Data Science LLM 통합

OCI(오라클 클라우드 인프라)의 데이터 사이언스 서비스를 LlamaIndex에서 바로 쓸 수 있도록 만든 통합 문서예요. 완전 관리형 서버리스 플랫폼 위에서 머신러닝 모델을 빌드·학습·관리하고, AI Quick Actions로 파운데이션 LLM을 배포·평가·파인튜닝할 수 있어요. 이 가이드를 따라가면 OCIDataScience 인터페이스만으로 완성·스트리밍·비동기·함수 호출까지 모두 다룰 수 있어요.

출처: 문서

본문

개요

Oracle Cloud Infrastructure (OCI) Data Science는 데이터 사이언스 팀이 OCI에서 머신러닝 모델을 빌드·학습·관리할 수 있도록 돕는 완전 관리형 서버리스 플랫폼이에요.

AI Quick Actions을 사용하면 OCI Data Science에서 파운데이션 LLM 모델을 배포·평가·파인튜닝할 수 있어요. AI Quick Actions는 AI의 역량을 빠르게 활용하고 싶은 사용자를 대상으로, 코드 없이 효율적으로 파운데이션 모델을 다룰 수 있는 간소화된 환경을 제공해 더 넓은 사용자층에게 파운데이션 모델을 확장하려는 목적을 지녀요. AI Quick Actions는 Data Science Notebook에서 접근할 수 있어요.

AI Quick Actions로 OCI Data Science에서 LLM 모델을 배포하는 자세한 방법은 여기와 여기에서 확인할 수 있어요.

이 노트북은 LlamaIndex와 함께 OCI의 Data Science 모델을 사용하는 방법을 설명해요.

Setup (설치)

Colab에서 이 노트북을 여는 경우 LlamaIndex 🦙 설치가 필요할 거예요.

%pip install llama-index-llms-oci-data-science
!pip install llama-index

또한 oracle-ads SDK 설치가 필요해요.

!pip install -U oracle-ads

Authentication (인증)

LlamaIndex가 지원하는 인증 방식은 다른 OCI 서비스에서 쓰는 방식과 동일하며 표준 SDK 인증 방식을 따르는데, 구체적으로는 API Key, session token, instance principal, resource principal이 있어요. 자세한 내용은 여기에서 볼 수 있어요. OCI Data Science Model Deployment 엔드포인트에 접근하려면 필요한 정책(policies)을 갖추고 있어야 해요. oracle-ads는 OCI Data Science 내 인증을 간편하게 해줘요.

Basic Usage (기본 사용법)

LlamaIndex에서 OCI Data Science AI가 제공하는 LLM을 사용하려면 OCIDataScience 인터페이스를 Data Science Model Deployment 엔드포인트와 모델 ID로 초기화하기만 하면 돼요. 기본적으로 AI Quick Actions에 배포된 모든 모델은 odsc-model ID를 가져요. 다만 이 ID는 배포 과정에서 변경할 수 있어요.

complete를 프롬프트와 함께 호출하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = llm.complete("Tell me a joke")


print(response)

메시지 목록으로 chat 호출하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.base.llms.types import ChatMessage


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = llm.chat(
    [
        ChatMessage(role="user", content="Tell me a joke"),
        ChatMessage(
            role="assistant", content="Why did the chicken cross the road?"
        ),
        ChatMessage(role="user", content="I don't know, why?"),
    ]
)


print(response)

Streaming (스트리밍)

전용 스트리밍 엔드포인트 사용하기

from llama_index.llms.oci_data_science import OCIDataScience
import ads


ads.set_auth(auth="security_token", profile="OC1")


llm = OCIDataScience(
    endpoint="https://<MD_OCID>/predictWithResponseStream",
    model="odsc-llm",
)


prompt = "What is the capital of France?"
response = llm.stream_complete(prompt)
for chunk in response:
    print(chunk.delta, end="")

stream_complete 엔드포인트 사용하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)


for chunk in llm.stream_complete("Tell me a joke"):
    print(chunk.delta, end="")

stream_chat 엔드포인트 사용하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.base.llms.types import ChatMessage


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = llm.stream_chat(
    [
        ChatMessage(role="user", content="Tell me a joke"),
        ChatMessage(
            role="assistant", content="Why did the chicken cross the road?"
        ),
        ChatMessage(role="user", content="I don't know, why?"),
    ]
)


for chunk in response:
    print(chunk.delta, end="")

Async (비동기)

acomplete를 프롬프트와 함께 호출하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = await llm.acomplete("Tell me a joke")


print(response)

메시지 목록으로 achat 호출하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.base.llms.types import ChatMessage


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = await llm.achat(
    [
        ChatMessage(role="user", content="Tell me a joke"),
        ChatMessage(
            role="assistant", content="Why did the chicken cross the road?"
        ),
        ChatMessage(role="user", content="I don't know, why?"),
    ]
)


print(response)

astream_complete 엔드포인트 사용하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)


async for chunk in await llm.astream_complete("Tell me a joke"):
    print(chunk.delta, end="")

astream_chat 엔드포인트 사용하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.base.llms.types import ChatMessage


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
)
response = await llm.stream_chat(
    [
        ChatMessage(role="user", content="Tell me a joke"),
        ChatMessage(
            role="assistant", content="Why did the chicken cross the road?"
        ),
        ChatMessage(role="user", content="I don't know, why?"),
    ]
)


async for chunk in response:
    print(chunk.delta, end="")

Configure Model (모델 설정)

import ads
from llama_index.llms.oci_data_science import OCIDataScience


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
    temperature=0.2,
    max_tokens=500,
    timeout=120,
    context_window=2500,
    additional_kwargs={
        "top_p": 0.75,
        "logprobs": True,
        "top_logprobs": 3,
    },
)
response = llm.chat(
    [
        ChatMessage(role="user", content="Tell me a joke"),
    ]
)
print(response)

Function Calling (함수 호출)

AI Quick Actions는 대규모 언어 모델을 매우 쉽게 배포·서빙할 수 있게 해주는 미리 빌드된 서비스 컨테이너를 제공해요. 서비스 컨테이너에는 vLLM(LLM을 위한 고성능·메모리 효율적인 추론·서빙 엔진) 또는 TGI(인기 오픈소스 LLM을 위한 고성능 텍스트 생성 서버) 중 하나가 사용돼 모델을 호스팅하며, 생성된 엔드포인트는 OpenAI API 프로토콜을 지원해요. 덕분에 이 모델 배포는 OpenAI API를 사용하는 애플리케이션의 드롭-인 대체품으로 쓸 수 있어요. 배포된 모델이 함수 호출을 지원한다면, llm의 predict_and_call 함수를 통해 LlamaIndex 툴과 통합해 어떤 툴을 호출할지(있다면) LLM이 결정하도록 할 수 있어요.

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.tools import FunctionTool


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
    temperature=0.2,
    max_tokens=500,
    timeout=120,
    context_window=2500,
    additional_kwargs={
        "top_p": 0.75,
        "logprobs": True,
        "top_logprobs": 3,
    },
)




def multiply(a: float, b: float) -> float:
    print(f"---> {a} * {b}")
    return a * b




def add(a: float, b: float) -> float:
    print(f"---> {a} + {b}")
    return a + b




def subtract(a: float, b: float) -> float:
    print(f"---> {a} - {b}")
    return a - b




def divide(a: float, b: float) -> float:
    print(f"---> {a} / {b}")
    return a / b




multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)
sub_tool = FunctionTool.from_defaults(fn=subtract)
divide_tool = FunctionTool.from_defaults(fn=divide)


response = llm.predict_and_call(
    [multiply_tool, add_tool, sub_tool, divide_tool],
    user_msg="Calculate the result of `8 + 2 - 6`.",
    verbose=True,
)


print(response)

FunctionAgent 사용하기

import ads
from llama_index.llms.oci_data_science import OCIDataScience
from llama_index.core.tools import FunctionTool
from llama_index.core.agent.workflow import FunctionAgent


ads.set_auth(auth="security_token", profile="<replace-with-your-profile>")


llm = OCIDataScience(
    model="odsc-llm",
    endpoint="https://<MD_OCID>/predict",
    temperature=0.2,
    max_tokens=500,
    timeout=120,
    context_window=2500,
    additional_kwargs={
        "top_p": 0.75,
        "logprobs": True,
        "top_logprobs": 3,
    },
)




def multiply(a: float, b: float) -> float:
    print(f"---> {a} * {b}")
    return a * b




def add(a: float, b: float) -> float:
    print(f"---> {a} + {b}")
    return a + b




def subtract(a: float, b: float) -> float:
    print(f"---> {a} - {b}")
    return a - b




def divide(a: float, b: float) -> float:
    print(f"---> {a} / {b}")
    return a / b




multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)
sub_tool = FunctionTool.from_defaults(fn=subtract)
divide_tool = FunctionTool.from_defaults(fn=divide)


agent = FunctionAgent(
    tools=[multiply_tool, add_tool, sub_tool, divide_tool],
    llm=llm,
)
response = await agent.run(
    "Calculate the result of `8 + 2 - 6`. Use tools. Return the calculated result."
)


print(response)

더 알아보기 (Learn more)