다음을 통해 공유


에이전트의 입력 및 출력 스키마 정의

AI 에이전트는 Azure Databricks의 다른 기능과 호환되려면 특정 입력 및 출력 스키마 요구 사항을 준수해야 합니다. 이 문서에서는 AI 에이전트가 이러한 요구 사항을 준수하는지 확인하는 방법과 호환성을 보장하면서 에이전트의 입력 및 출력 스키마를 사용자 지정하는 방법을 설명합니다.

Mosaic AI는 MLflow 모델 서명 사용하여 에이전트의 입력 및 출력 스키마 요구 사항을 정의합니다. 모델 서명은 에이전트와 상호 작용하는 방법을 내부 및 외부 구성 요소에 알리고 스키마를 준수하는지 확인합니다.

OpenAI 채팅 완료 스키마(권장)

Databricks는 OpenAI 채팅 완료 스키마 사용하여 에이전트 입력 및 출력을 정의하는 것이 좋습니다. 이 스키마는 Databricks를 포함하여 많은 에이전트 프레임워크 및 애플리케이션과 광범위하게 채택되고 호환됩니다.

OpenAI 설명서를 참조하세요. 채팅 완료 입력 스키마출력 스키마에 대한 자세한 정보를 확인하십시오.

참고 항목

OpenAI 채팅 완료 스키마는 에이전트 입력 및 출력을 구조화하기 위한 표준일 뿐입니다. 이 스키마 구현에는 OpenAI의 리소스 또는 모델을 사용하는 것이 포함되지 않습니다.

MLflow는 LangChain 및 PyFunc 버전 에이전트에 편리한 API를 제공하여 채팅 완료 스키마와 호환되는 에이전트를 만들 수 있도록 지원합니다.

LangChain을 사용하여 채팅 완료 구현

에이전트가 LangChain을 사용하는 경우 MLflow의 ChatCompletionOutputParser() 사용하여 채팅 완료 스키마와 호환되도록 에이전트의 최종 출력 형식을 지정합니다. LangGraph를 사용하는 경우 LangGraph 사용자 지정 스키마참조하세요.


  from mlflow.langchain.output_parsers import ChatCompletionOutputParser

  chain = (
      {
          "user_query": itemgetter("messages")
          | RunnableLambda(extract_user_query_string),
          "chat_history": itemgetter("messages") | RunnableLambda(extract_chat_history),
      }
      | RunnableLambda(DatabricksChat)
      | ChatCompletionOutputParser()
  )

PyFunc를 사용하여 채팅 완료 구현

PyFunc를 사용하는 경우 Databricks는 에이전트를 mlflow.pyfunc.ChatModel하위 클래스로 작성하는 것이 좋습니다. 이 메서드는 다음과 같은 이점을 제공합니다.

  • 형식화된 Python 클래스를 사용하여 채팅 완료 스키마와 호환되는 에이전트 코드를 작성할 수 있습니다.

  • 에이전트를 로깅할 때 MLflow는 input_example없더라도 채팅 완료 호환 서명을 자동으로 유추합니다. 이렇게 하면 에이전트를 등록하고 배포하는 프로세스가 간소화됩니다. 로깅하는 동안 모델 서명 유추를 참조하세요.

    from dataclasses import dataclass
    from typing import Optional, Dict, List, Generator
    from mlflow.pyfunc import ChatModel
    from mlflow.types.llm import (
        # Non-streaming helper classes
        ChatCompletionRequest,
        ChatCompletionResponse,
        ChatCompletionChunk,
        ChatMessage,
        ChatChoice,
        ChatParams,
        # Helper classes for streaming agent output
        ChatChoiceDelta,
        ChatChunkChoice,
    )
    
    class MyAgent(ChatModel):
        """
        Defines a custom agent that processes ChatCompletionRequests
        and returns ChatCompletionResponses.
        """
        def predict(self, context, messages: list[ChatMessage], params: ChatParams) -> ChatCompletionResponse:
            last_user_question_text = messages[-1].content
            response_message = ChatMessage(
                role="assistant",
                content=(
                    f"I will always echo back your last question. Your last question was: {last_user_question_text}. "
                )
            )
            return ChatCompletionResponse(
                choices=[ChatChoice(message=response_message)]
            )
    
        def _create_chat_completion_chunk(self, content) -> ChatCompletionChunk:
            """Helper for constructing a ChatCompletionChunk instance for wrapping streaming agent output"""
            return ChatCompletionChunk(
                    choices=[ChatChunkChoice(
                        delta=ChatChoiceDelta(
                            role="assistant",
                            content=content
                        )
                    )]
                )
    
        def predict_stream(
            self, context, messages: List[ChatMessage], params: ChatParams
        ) -> Generator[ChatCompletionChunk, None, None]:
            last_user_question_text = messages[-1].content
            yield self._create_chat_completion_chunk(f"Echoing back your last question, word by word.")
            for word in last_user_question_text.split(" "):
                yield self._create_chat_completion_chunk(word)
    
    agent = MyAgent()
    model_input = ChatCompletionRequest(
        messages=[ChatMessage(role="user", content="What is Databricks?")]
    )
    response = agent.predict(context=None, model_input=model_input)
    print(response)
    

사용자 지정 입력 및 출력

Databricks는 대부분의 에이전트 사용 사례에 대해 OpenAI 채팅 완료 스키마를 준수하는 것이 좋습니다.

그러나 일부 시나리오에서는 client_typesession_id같은 추가 입력 또는 향후 상호 작용을 위해 채팅 기록에 포함되지 않아야 하는 검색 원본 링크와 같은 출력이 필요할 수 있습니다.

이러한 시나리오의 경우 Mosaic AI Agent Framework는 사용자 지정 입력 및 출력을 사용하여 OpenAI 채팅 완료 요청 및 응답을 보강할 수 있습니다.

PyFunc 및 LangGraph 에이전트에 대한 사용자 지정 입력 및 출력을 만드는 방법을 알아보려면 다음 예제를 참조하세요.

경고

에이전트 평가 검토 앱 현재 추가 입력 필드가 있는 에이전트에 대한 렌더링 추적을 지원하지 않습니다.

PyFunc 사용자 지정 스키마

다음 Notebook에서는 PyFunc를 사용하는 사용자 지정 스키마 예제를 보여 줍니다.

PyFunc 사용자 지정 스키마 에이전트 Notebook

Notebook 가져오기

PyFunc 사용자 지정 스키마 드라이버 Notebook

Notebook 가져오기

LangGraph 사용자 지정 스키마

다음 노트북에서는 LangGraph를 사용한 사용자 지정 스키마의 예를 보여줍니다. 전자 필기장에서 wrap_output 함수를 수정하여 메시지 스트림에서 정보를 구문 분석하고 추출할 수 있습니다.

LangGraph 사용자 지정 스키마 에이전트 노트북

Notebook 가져오기

LangGraph 사용자 지정 스키마 드라이버 노트

Notebook 가져오기

AI 플레이그라운드 및 에이전트 검토 앱에서 제공 custom_inputs

에이전트가 custom_inputs 필드를 사용하여 추가 입력을 수락하는 경우 AI Playground에이전트 검토 앱모두에 이러한 입력을 수동으로 제공할 수 있습니다.

  1. AI 플레이그라운드 또는 에이전트 검토 앱에서 기어 아이콘 기어 아이콘을 선택합니다.

  2. custom_inputs 사용하도록 설정합니다.

  3. 에이전트의 정의된 입력 스키마와 일치하는 JSON 개체를 제공합니다.

    AI 놀이터에서 custom_inputs 제공합니다.

레거시 입력 및 출력 스키마

SplitChatMessageRequest 입력 스키마 및 StringResponse 출력 스키마는 더 이상 사용되지 않습니다. 이러한 레거시 스키마 중 하나를 사용하는 경우 Databricks는 권장 채팅 완료 스키마로 마이그레이션하는 것이 좋습니다.

SplitChatMessageRequest 입력 스키마(사용되지 않음)

SplitChatMessagesRequest 현재 쿼리와 히스토리를 에이전트 입력으로 각각 별도로 전달할 수 있습니다.

  question = {
      "query": "What is MLflow",
      "history": [
          {
              "role": "user",
              "content": "What is Retrieval-augmented Generation?"
          },
          {
              "role": "assistant",
              "content": "RAG is"
          }
      ]
  }

StringResponse 출력 스키마(사용되지 않음)

StringResponse 당신은 에이전트의 응답을 단일 문자열 content 필드로 구성된 개체로 반환할 수 있습니다.

{"content": "This is an example string response"}