흐름

흐름은 직접 함수보다 몇 가지 추가 특성이 있는 래핑된 함수입니다. 호출: 유형이 지정되고 스트리밍 가능하며 로컬 및 원격으로 호출할 수 있습니다. 완전히 관찰 가능합니다. Firebase Genkit는 흐름 실행과 디버깅을 위한 CLI 및 개발자 UI 도구를 제공합니다.

흐름 정의

가장 간단한 형태에서는 흐름이 함수를 래핑합니다.

Go

menuSuggestionFlow := genkit.DefineFlow(
  "menuSuggestionFlow",
  func(ctx context.Context, restaurantTheme string) (string, error) {
      suggestion := makeMenuItemSuggestion(restaurantTheme)
      return suggestion, nil
  })

이렇게 하면 Genkit CLI 및 개발자 UI에서 함수를 실행할 수 있습니다. Genkit의 많은 기능에 대한 요구사항으로 살펴봤습니다

모델 API를 직접 호출하는 것에 비해 Genkit 흐름의 중요한 이점은 다음과 같습니다. 입력 및 출력 모두의 유형 안전성:

Go

흐름의 인수 및 결과 유형은 단순 값일 수도 있고 구조화된 값일 수도 있습니다. Genkit는 이 값을 사용하여 JSON 스키마를 생성합니다. invopop/jsonschema

다음 흐름은 string를 입력으로 사용하고 struct를 출력합니다.

type MenuSuggestion struct {
  ItemName    string `json:"item_name"`
  Description string `json:"description"`
  Calories    int    `json:"calories"`
}
menuSuggestionFlow := genkit.DefineFlow(
  "menuSuggestionFlow",
  func(ctx context.Context, restaurantTheme string) (MenuSuggestion, error) {
      suggestion := makeStructuredMenuItemSuggestion(restaurantTheme)
      return suggestion, nil
  },
)

실행 중인 흐름

코드에서 흐름을 실행하려면 다음 안내를 따르세요.

Go

suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")

CLI를 사용하여 흐름을 실행할 수도 있습니다.

genkit flow:run menuSuggestionFlow '"French"'

스트리밍됨

다음은 값을 스트리밍할 수 있는 흐름의 간단한 예입니다.

Go

// Types for illustrative purposes.
type InputType string
type OutputType string
type StreamType string
menuSuggestionFlow := genkit.DefineStreamingFlow(
  "menuSuggestionFlow",
  func(
      ctx context.Context,
      restaurantTheme InputType,
      callback func(context.Context, StreamType) error,
  ) (OutputType, error) {
      var menu strings.Builder
      menuChunks := make(chan StreamType)
      go makeFullMenuSuggestion(restaurantTheme, menuChunks)
      for {
          chunk, ok := <-menuChunks
          if !ok {
              break
          }
          if callback != nil {
              callback(context.Background(), chunk)
          }
          menu.WriteString(string(chunk))
      }
      return OutputType(menu.String()), nil
  },
)

스트리밍 콜백은 정의되지 않을 수 있습니다. 이는 포드가 스트리밍 응답을 요청하는 것입니다.

스트리밍 모드에서 흐름을 호출하려면 다음 안내를 따르세요.

Go

menuSuggestionFlow.Stream(
  context.Background(),
  "French",
)(func(sfv *genkit.StreamFlowValue[OutputType, StreamType], err error) bool {
  if !sfv.Done {
      fmt.Print(sfv.Output)
      return true
  } else {
      return false
  }
})

흐름이 스트리밍을 구현하지 않으면 StreamFlow()RunFlow()

CLI를 사용하여 흐름을 스트리밍할 수도 있습니다.

genkit flow:run menuSuggestionFlow '"French"' -s

흐름 배포

HTTP를 통해 흐름에 액세스하려면 이를 배포해야 합니다. 있습니다.

Go

Cloud Run 및 유사 서비스를 사용하여 흐름을 배포하려면 흐름을 정의합니다. 그런 다음 Init()를 호출합니다.

func main() {
  genkit.DefineFlow(
      "menuSuggestionFlow",
      func(ctx context.Context, restaurantTheme string) (string, error) {
          // ...
          return "", nil
      },
  )
  if err := genkit.Init(context.Background(), nil); err != nil {
      log.Fatal(err)
  }
}

Init는 흐름을 HTTP로 노출하는 net/http 서버를 시작합니다. 엔드포인트 (예: http://localhost:3400/menuSuggestionFlow)

두 번째 매개변수는 다음을 지정하는 Options(선택사항)입니다.

  • FlowAddr: 리슨할 주소와 포트입니다. 지정하지 않으면 서버가 PORT 환경 변수로 지정한 포트에서 리슨합니다. 비어 있으면 기본값 포트 3400을 사용합니다.
  • Flows: 제공할 흐름입니다. 지정하지 않으면 Init에서 사용자 인증 정보를 제공합니다

다른 엔드포인트와 동일한 호스트 및 포트에서 흐름을 제공하려면 FlowAddr-로 설정하고 대신 NewFlowServeMux()를 호출하여 핸들러를 가져올 수 있습니다. 다른 경로 핸들러를 사용하여 멀티플렉싱할 수 있습니다.

mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))

흐름 관측 가능성

관측 가능성을 위해 계측되지 않은 서드 파티 SDK를 사용하는 경우 개발자 UI에서 별도의 트레이스 단계로 보는 것이 좋습니다. 모든 사용자 run 함수에서 코드를 래핑하면 됩니다.

genkit.DefineFlow(
    "menuSuggestionFlow",
    func(ctx context.Context, restaurantTheme string) (string, error) {
        themes, err := genkit.Run(ctx, "find-similar-themes", func() (string, error) {
            // ...
            return "", nil
        })

        // ...
        return themes, err
    })