애플리케이션 템플릿 맞춤설정

애플리케이션 개발에서는 애플리케이션 개발을 위해 사전 빌드된 템플릿(예: reasoning_engines.LangchainAgent)을 사용했습니다. 이 섹션에서는 자체 애플리케이션 템플릿을 맞춤설정하는 단계를 살펴봅니다. 이 방법은 사전 빌드된 템플릿에서 제공하는 범위를 넘어야 하는 경우에 유용할 수 있습니다.

Reasoning Engine의 애플리케이션 템플릿은 Python 클래스로 정의됩니다. 예를 들어 다음 Python 코드는 Vertex AI에 배포할 수 있는 LangChain 애플리케이션의 예시입니다. CLASS_NAME 변수에 MyAgent와 같은 값을 지정할 수 있습니다.

from typing import Callable, Sequence

class CLASS_NAME:
    def __init__(
            self,
            model: str,
            tools: Sequence[Callable],
            project: str,
            location: str,
        ):
        self.model_name = model
        self.tools = tools
        self.project = project
        self.location = location

    def set_up(self):
        """All unpickle-able logic should go here.

        The .set_up() method should not be called for an object that is being
        prepared for deployment.
        """
        import vertexai
        from langchain_google_vertexai import ChatVertexAI
        from langchain.agents import AgentExecutor
        from langchain.agents.format_scratchpad.tools import format_to_tool_messages
        from langchain.agents.output_parsers.tools import ToolsAgentOutputParser
        from langchain.tools.base import StructuredTool
        from langchain_core import prompts

        vertexai.init(project=self.project, location=self.location)

        prompt = {
            "input": lambda x: x["input"],
            "agent_scratchpad": (
                lambda x: format_to_tool_messages(x["intermediate_steps"])
            ),
        } | prompts.ChatPromptTemplate.from_messages([
            ("user", "{input}"),
            prompts.MessagesPlaceholder(variable_name="agent_scratchpad"),
        ])

        llm = ChatVertexAI(model_name=self.model_name)
        if self.tools:
            llm = llm.bind_tools(tools=self.tools)

        self.agent_executor = AgentExecutor(
            agent=prompt | llm | ToolsAgentOutputParser(),
            tools=[StructuredTool.from_function(tool) for tool in self.tools],
        )

    def query(self, input: str):
        """Query the application.

        Args:
            input: The user prompt.

        Returns:
            The output of querying the application with the given input.
        """
        return self.agent_executor.invoke(input={"input": input})

Python 클래스를 작성할 때 추론 엔진에 다음 세 가지 메서드가 중요합니다.

  1. __init__():
    • 애플리케이션 구성 매개변수에만 이 메서드를 사용하세요. 예를 들어 이 메서드를 사용하여 모델 매개변수와 안전 속성을 사용자의 입력 인수로 수집할 수 있습니다. 이 메서드를 사용하여 프로젝트 ID, 리전, 애플리케이션 사용자 인증 정보, API 키와 같은 매개변수를 수집할 수도 있습니다.
    • 생성자는 추론 엔진에 배포할 수 있도록 '피클 가능'이어야 하는 객체를 반환합니다. 따라서 서비스 클라이언트를 초기화하고 __init__ 메서드가 아닌 .set_up 메서드에서 데이터베이스에 대한 연결을 설정해야 합니다.
    • 이 메서드는 선택사항입니다. 지정하지 않으면 Vertex AI가 클래스에 기본 Python 생성자를 사용합니다.
  2. set_up():
    • 애플리케이션 초기화 논리를 정의하려면 이 메서드를 사용해야 합니다. 예를 들어 이 방법을 사용하여 데이터베이스 또는 종속 서비스에 대한 연결을 설정하거나 종속 패키지를 가져오거나 쿼리 제공에 사용되는 데이터를 미리 계산할 수 있습니다.
    • 이 메서드는 선택사항입니다. 지정하지 않으면 Vertex AI는 사용자 쿼리를 처리하기 전에 애플리케이션이 .set_up 메서드를 호출할 필요가 없다고 가정합니다.
  3. query():
    • 사용자 쿼리를 처리하는 런타임 로직을 정의하려면 이 메서드를 사용해야 합니다. 예를 들어 이 메서드를 사용하여 생성형 AI 모델로 콘텐츠를 생성하거나 외부 API에서 실시간 데이터를 검색할 수 있습니다.
    • 이 메서드는 필수 항목입니다. 지정하지 않으면 애플리케이션의 원격 인스턴스를 만들려고 할 때 ReasoningEngine 서비스에서 오류를 반환합니다.
    • 이 메서드의 기능을 정의하고, 속성을 문서화하고, 입력에 대한 유형 주석을 제공하는 명확한 docstring을 제공해야 합니다. query 메서드에 변수 인수를 사용하지 않습니다.

로컬로 애플리케이션 테스트

다음 코드를 사용하여 로컬 메모리에서 애플리케이션을 인스턴스화합니다.

agent = CLASS_NAME(
    model=model,  # Required.
    tools=[get_exchange_rate],  # Optional.
    project=PROJECT_ID,
    location=LOCATION,
)
agent.set_up()

테스트 쿼리를 로컬 인스턴스에 전송하여 애플리케이션을 테스트할 수 있습니다.

response = agent.query(
    input="What is the exchange rate from US dollars to Swedish currency?"
)

응답은 다음과 비슷한 사전입니다.

{"input": "What is the exchange rate from US dollars to Swedish currency?",
 # ...
 "output": "For 1 US dollar you will get 10.7345 Swedish Krona."}

다음 단계