파일 지식 원본 만들기(미리 보기)

메모

Azure AI 검색 Azure 포털, REST API 및 Azure SDK 통해 사용할 수 있습니다. 또한 엔터프라이즈 콘텐츠를 Microsoft Foundry 포털의 에이전트에 대해 재사용 가능한 사용 권한 인식 기술 자료로 변환하는 관리되는 기술 계층인 Foundry IQ를 뒷받침합니다.

Important

기능, 기능 또는 표시된 속성(미리 보기)은 서비스 수준 계약에 포함되지 않으며 프로덕션 워크로드에는 권장되지 않으며 일반적으로 사용 가능해지기 전에 변경되거나 제한될 수 있습니다. Azure AI 검색 미리 보기 용어는 독립 실행형 기능이든 일반 공급 기능의 일부이든 관계없이 모든 미리 보기 기능에 적용됩니다.

파일 지식 소스 (미리 보기)는 에이전트형 검색을 위해 소규모에서 중간 규모의 파일 집합을 Azure AI 검색에 직접 업로드합니다. 기술 원본은 독립적으로 생성되고, 기술 자료에서 참조되며, 런타임에 기술 자료를 쿼리할 때 접지 데이터로 사용됩니다.

파일 지식 원본은 Azure Storage 프로비전하고, 액세스를 구성하고, 외부 컨테이너를 통해 인덱서 파이프라인을 만드는 대신 관리되는 업로드 환경을 원하는 경우에 유용합니다. Azure AI 검색 기술 자료에서 추출된 콘텐츠를 검색할 수 있도록 업로드된 파일을 처리합니다.

파일이 이미 Azure Blob Storage 또는 Azure Data Lake Storage Gen2에 있거나, 파일 집합이 파일 지식 원본 제한을 초과하거나 초과할 가능성이 있거나, 예약된 수집이 필요한 경우에는 대신 blob 지식 원본을 사용하세요. 또한 원본 Blob을 Azure Blob Storage 수명 주기 관리 정책으로 관리하려는 경우 또는 Azure Storage의 권한을 기반으로 하는 문서 수준 권한(미리 보기)이 필요한 경우 Blob 지식 원본을 사용하세요.

사용량 지원

Azure Portal Microsoft Foundry 포털 .NET SDK Python SDK Java SDK JavaScript SDK REST API
❌ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

사전 요구 사항

  • Azure AI 검색 서비스는 모든 지역에서 에이전트 검색 기능을 제공합니다. 파일 지식 원본은 전용 및 서버리스 가격 책정 모델을 모두 지원합니다. 모델 및 계층 세부 정보는 가격 책정 모델 및 서비스 계층 선택을 참조하세요.

  • Azure AI 검색 비용을 검토합니다. 모델 호출, 벡터화 및 기타 AI 처리에는 별도의 요금이 부과될 수 있습니다.

  • 서버리스에서 성공적인 파일 수집 작업은 청구 가능한 컴퓨팅을 사용합니다. 업로드에 실패해도 서버리스 컴퓨팅 요금이 발생하지 않습니다.

  • 월별 무료 수당을 초과하는 유료 에이전트 검색이 필요한 경우 표준 에이전트 검색 계획을 사용하도록 설정합니다. 이 knowledgeRetrieval=standard 설정은 서버리스 컴퓨팅 및 스토리지 요금과 별개이며 가격 책정 모델을 선택하지 않습니다.

  • 지원되는 형식의 파일입니다.

  • 지식 원본을 만들 수 있는 권한입니다. 사용자 계정에 할당된 Search Service 기여자 역할로 키 없는 인증을 구성하거나(권장) 관리자 API 키를 사용합니다.

  • 지식 원본이 임베딩용 Azure OpenAI 모델을 지정하는 경우, 검색 서비스에는 Microsoft Foundry 리소스에 대한 관리 ID와 Cognitive Services User 권한이 있어야 합니다.

    • Foundry 리소스에 공용 네트워크 액세스가 사용하지 않도록 설정된 경우 검색 서비스에서 Foundry 리소스로의 공유 프라이빗 링크를 만들고 foundry_account신뢰할 수 있는 서비스 목록 설정에서 리소스의 Azure 서비스 허용을 사용하도록 설정합니다.
  • 지식 원본이 콘텐츠 추출 모드를 standard 지정하는 경우 Azure Content Understanding 기술에 대한 요구 사항을 검토합니다.

    • 사용량은 Azure Content Understanding in Foundry Tools를 통해 aiServices구성된 Foundry 리소스에 대한 가격 책정 시 청구됩니다.

    • 일부 기본 제공 기술에 사용할 수 있는 20개 문서 일일 무료 허용량은 적용되지 않습니다.

    • 이 문서의 예제에서는 Foundry 리소스 엔드포인트 및 키와 Azure OpenAI 포함 및 채팅 완성 모델 정보가 필요합니다.

  • 최신 Azure.Search.Documents 미리 보기 패키지: dotnet add package Azure.Search.Documents --prerelease

  • 키 없는 인증의 경우 패키지:Azure.Identitydotnet add package Azure.Identity

파일 지원 및 제한

파일 기술 자료를 만들기 전에 파일 업로드, 추출 및 관리에 영향을 주는 요구 사항 및 제한을 검토합니다.

지원되는 콘텐츠 형식

파일 지식 원본은 검색된 콘텐츠 형식에 따라 파일을 허용합니다. 호출자가 제공한 콘텐츠 형식은 감지 결과를 재정의하지 않습니다.

지원되는 콘텐츠 형식은 다음과 같습니다.

  • PDF
  • Word(.doc, .docx)
  • PowerPoint(.ppt, .pptx)
  • Excel(.xls, .xlsx)
  • JSON
  • 셸 스크립트
  • text/*(으)로 감지된 콘텐츠(예: .txt, .md, .html, .csv)

지원되는 추출 모드

  • 나열된 콘텐츠 형식의 경우 모두 2026-05-01-preview 지원합니다 2026-08-01-previewminimal. standard는 2026-08-01-preview에서만 사용할 수 있습니다.

  • 콘텐츠가 2026-05-01-preview(으)로 감지되었으며 image/*에서는 지원되지 않습니다. 2026-08-01-preview에서는 standard 추출을 사용합니다. minimal 추출은 두 버전 모두에서 HTTP 상태를 415 반환합니다.

제한 및 파일 작업

제한 및 지원되는 파일 작업은 API 버전에 따라 다릅니다.

역량 2026-05-01-preview 2026-08-01-preview
지식 원본당 최대 파일 수 100 200
최대 파일 크기 지원되는 모든 가격 책정 계층에서 50MB Free 및 Basic은 50MB, 지원되는 다른 전용 계층 및 Serverless는 100MB
처리 기간 업로드는 최대 180초 동안 실행할 수 있습니다. 업로드 및 업데이트는 최대 180초 동안 실행할 수 있습니다.
콘텐츠 및 메타데이터 업로드 원시 파일 콘텐츠 메타데이터가 있는 원시 파일 콘텐츠 또는 다중 파트 콘텐츠
업로드된 파일 나열 파일 나열 경로 또는 파일 이름으로 필터링하고 더 풍부한 파일 세부 정보를 반환합니다.
기존 파일 콘텐츠 바꾸기 삭제 및 다시 업로드 업데이트 작업 사용
파일 작업에 대한 브라우저 액세스 CORS를 사용할 수 없음 CORS 구성하기

메모

  • 생성된 검색 인덱스가 업로드된 콘텐츠를 저장합니다. 가격 책정 계층별 총 스토리지 제한은 서비스 제한을 참조하세요.
  • 업로드된 콘텐츠를 청크 또는 벡터화하도록 파일 기술 자료를 구성하는 경우 모델 및 다운스트림 처리 제한도 적용됩니다.

기존 지식 원본 확인

기술 자료는 재사용 가능한 최상위 개체입니다. 기존 지식 원본에 대해 아는 것은 새 개체를 다시 사용하거나 이름을 지정하는 데 유용합니다.

다음 코드를 실행하여 이름 및 형식별로 기술 자료를 나열합니다.

// List knowledge sources by name and type
using Azure.Search.Documents.Indexes;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);
var knowledgeSources = indexClient.GetKnowledgeSourcesAsync();

Console.WriteLine("Knowledge Sources:");

await foreach (var ks in knowledgeSources)
{
    Console.WriteLine($"  Name: {ks.Name}, Type: {ks.GetType().Name}");
}

참조:SearchIndexClient

# List knowledge sources by name and type
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))

for ks in index_client.list_knowledge_sources():
    print(f"  - {ks.name} ({ks.kind})")

참조:SearchIndexClient

### List knowledge sources by name and type
GET {{search-url}}/knowledgesources?api-version={{api-version}}&$select=name,kind
Authorization: Bearer {{token}}

참조:기술 자료 - 목록

이름으로 단일 기술 원본을 반환하여 JSON 정의를 검토할 수도 있습니다.

using Azure.Search.Documents.Indexes;
using System.Text.Json;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);

// Specify the knowledge source name to retrieve
string ksNameToGet = "earth-knowledge-source";

// Get its definition
var knowledgeSourceResponse = await indexClient.GetKnowledgeSourceAsync(ksNameToGet);
var ks = knowledgeSourceResponse.Value;

// Serialize to JSON for display
var jsonOptions = new JsonSerializerOptions 
{ 
    WriteIndented = true,
    DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.Never
};
Console.WriteLine(JsonSerializer.Serialize(ks, ks.GetType(), jsonOptions));

참조:SearchIndexClient

# Get a knowledge source definition
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
import json

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))

ks = index_client.get_knowledge_source("knowledge_source_name")
print(json.dumps(ks.as_dict(), indent = 2))

참조:SearchIndexClient

### Get a knowledge source definition
GET {{search-url}}/knowledgesources/{{knowledge-source-name}}?api-version={{api-version}}
Authorization: Bearer {{token}}

참조:기술 자료 - 가져오기

다음 JSON은 파일 지식 원본에 대한 예제 응답입니다.

{
  "name": "my-file-ks",
  "kind": "file",
  "description": "A sample file knowledge source.",
  "encryptionKey": null,
  "fileParameters": {
    "ingestionParameters": {
      "contentExtractionMode": "minimal",
      "embeddingModel": {
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "<REDACTED>",
          "deploymentId": "text-embedding-3-large",
          "modelName": "text-embedding-3-large"
        }
      }
    }
  }
}

기술 자료 만들기

업로드된 콘텐츠를 벡터화하는 데 사용되는 포함 모델을 지정하는 파일 지식 원본을 만듭니다.

각 파일 지식 원본은 인덱스는 생성하지만 인덱서나 일정은 생성하지 않습니다. fileParameters.ingestionParameters 개체를 포함해야 합니다. 서비스는 networkAccessMode를 지정한 요청을 거부합니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

var embeddingParams = new AzureOpenAIVectorizerParameters
{
    ResourceUri = new Uri(aoaiEndpoint),
    DeploymentName = aoaiEmbeddingDeployment,
    ModelName = aoaiEmbeddingModel
};

var ingestionParams = new KnowledgeSourceIngestionParameters
{
    ContentExtractionMode = "minimal",
    EmbeddingModel = new KnowledgeSourceAzureOpenAIVectorizer
    {
        AzureOpenAIParameters = embeddingParams
    }
};

var fileParams = new FileKnowledgeSourceParameters
{
    IngestionParameters = ingestionParams
};

var knowledgeSource = new FileKnowledgeSource(
    name: "my-file-ks",
    fileParameters: fileParams
)
{
    Description = "This knowledge source uses directly uploaded product manuals."
};

await indexClient.CreateOrUpdateKnowledgeSourceAsync(knowledgeSource);
Console.WriteLine($"Knowledge source '{knowledgeSource.Name}' created or updated successfully.");

참조:SearchIndexClient

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    AzureOpenAIVectorizerParameters,
    FileKnowledgeSource,
    FileKnowledgeSourceParameters,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeSourceAzureOpenAIVectorizer,
    KnowledgeSourceIngestionParameters,
)

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

embedding_params = AzureOpenAIVectorizerParameters(
    resource_url="<aoai-endpoint>",
    deployment_name="<aoai-embedding-deployment>",
    model_name="<aoai-embedding-model>",
)

ingestion_params = KnowledgeSourceIngestionParameters(
    content_extraction_mode="minimal",
    embedding_model=KnowledgeSourceAzureOpenAIVectorizer(
        azure_open_ai_parameters=embedding_params
    ),
)

knowledge_source = FileKnowledgeSource(
    name="my-file-ks",
    description="This knowledge source uses directly uploaded product manuals.",
    file_parameters=FileKnowledgeSourceParameters(ingestion_parameters=ingestion_params),
)

index_client.create_or_update_knowledge_source(knowledge_source=knowledge_source)
print(f"Knowledge source '{knowledge_source.name}' created or updated successfully.")

참조:SearchIndexClient

PUT {{search-endpoint}}/knowledgesources/my-file-ks?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
Prefer: return=representation

{
  "name": "my-file-ks",
  "kind": "file",
  "description": "This knowledge source uses directly uploaded product manuals.",
  "encryptionKey": null,
  "fileParameters": {
    "ingestionParameters": {
      "embeddingModel": {
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "{{aoai-endpoint}}",
          "deploymentId": "{{aoai-embedding-deployment}}",
          "modelName": "{{aoai-embedding-model}}"
        }
      },
      "contentExtractionMode": "minimal"
    }
  }
}

참조:기술 자료 - 만들기 또는 업데이트

표준 추출 설정

standard API 버전부터 2026-08-01-preview 추출은 Content Understanding을 사용하여 업로드된 파일에서 추출하고, 의미 단위로 청크화하고, 보강합니다. Azure AI 검색 기술 자료의 일부로 이 처리를 관리하며 Content Understanding 요금은 별도로 적용됩니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

var embeddingParameters = new AzureOpenAIVectorizerParameters
{
  ResourceUri = new Uri(aoaiEndpoint),
  DeploymentName = aoaiEmbeddingDeployment,
  ModelName = aoaiEmbeddingModel
};

var ingestionParameters = new KnowledgeSourceIngestionParameters
{
  ContentExtractionMode = KnowledgeSourceContentExtractionMode.Standard,
  AiServices = new AIServices(new Uri(foundryEndpoint)) { ApiKey = foundryKey },
  EmbeddingModel = new KnowledgeSourceAzureOpenAIVectorizer
  {
    AzureOpenAIParameters = embeddingParameters
  },
  ChatCompletionModel = new KnowledgeBaseAzureOpenAIModel(
    new AzureOpenAIVectorizerParameters
    {
      ResourceUri = new Uri(aoaiEndpoint),
      DeploymentName = aoaiChatDeployment,
      ModelName = aoaiChatModel
    })
};

var knowledgeSource = new FileKnowledgeSource(
  "my-file-ks",
  new FileKnowledgeSourceParameters { IngestionParameters = ingestionParameters });

await indexClient.CreateOrUpdateKnowledgeSourceAsync(knowledgeSource);
Console.WriteLine($"Configured standard extraction for '{knowledgeSource.Name}'.");

참조:SearchIndexClient

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
  AzureOpenAIVectorizerParameters,
  FileKnowledgeSource,
  FileKnowledgeSourceParameters,
  KnowledgeBaseAzureOpenAIModel,
)
from azure.search.documents.knowledgebases.models import (
  AIServices,
  KnowledgeSourceAzureOpenAIVectorizer,
  KnowledgeSourceIngestionParameters,
)

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

embedding_parameters = AzureOpenAIVectorizerParameters(
  resource_url="<aoai-endpoint>",
  deployment_name="<aoai-embedding-deployment>",
  model_name="<aoai-embedding-model>",
)
ingestion_parameters = KnowledgeSourceIngestionParameters(
  content_extraction_mode="standard",
  ai_services=AIServices(
    uri="<foundry-resource-endpoint>",
    api_key="<foundry-resource-key>",
  ),
  embedding_model=KnowledgeSourceAzureOpenAIVectorizer(
    azure_open_ai_parameters=embedding_parameters
  ),
  chat_completion_model=KnowledgeBaseAzureOpenAIModel(
    azure_open_ai_parameters=AzureOpenAIVectorizerParameters(
      resource_url="<aoai-endpoint>",
      deployment_name="<aoai-gpt-deployment>",
      model_name="<aoai-gpt-model>",
    )
  ),
)
knowledge_source = FileKnowledgeSource(
  name="my-file-ks",
  file_parameters=FileKnowledgeSourceParameters(
    ingestion_parameters=ingestion_parameters
  ),
)

index_client.create_or_update_knowledge_source(knowledge_source)
print(f"Configured standard extraction for '{knowledge_source.name}'.")

참조:SearchIndexClient

PUT {{search-endpoint}}/knowledgesources/my-file-ks?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
Prefer: return=representation

{
  "name": "my-file-ks",
  "kind": "file",
  "description": "This knowledge source uses standard extraction.",
  "fileParameters": {
    "ingestionParameters": {
      "embeddingModel": {
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "{{aoai-endpoint}}",
          "deploymentId": "{{aoai-embedding-deployment}}",
          "modelName": "{{aoai-embedding-model}}"
        }
      },
      "chatCompletionModel": {
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "{{aoai-endpoint}}",
          "deploymentId": "{{aoai-gpt-deployment}}",
          "modelName": "{{aoai-gpt-model}}"
        }
      },
      "contentExtractionMode": "standard",
      "aiServices": {
        "uri": "{{foundry-resource-endpoint}}",
        "apiKey": "{{foundry-resource-key}}"
      }
    }
  }
}

참조:기술 자료 - 만들기 또는 업데이트

파일 작업에 대한 CORS

브라우저 기반 파일 작업을 허용하려면 파일 지식 원본에서 애플리케이션의 신뢰할 수 있는 출처와 최대 프리플라이트 캐시 기간으로 corsOptions를 설정합니다.

Important

2026-08-01-preview API 버전 corsOptions 에서는 추출 모드와 독립적으로 파일 업로드, 나열, 업데이트 및 삭제 엔드포인트에 적용됩니다. corsOptions를 생략하면 파일 지식 원본에는 브라우저 교차 출처 정책이 적용되지 않습니다. CORS는 요청에 권한을 부여하지 않습니다. 원본을 사용하도록 설정하면 브라우저 컨텍스트에서 서비스 작업 및 데이터를 노출하고 보안 위험을 초래할 수 있습니다. 신뢰할 수 있는 원본만 지정하고 프로덕션 환경에서 와일드카드 원본을 사용하지 마세요. 브라우저 요청의 경우 필요한 최소 역할로 Microsoft Entra 토큰 인증을 사용합니다. 브라우저 코드에서 액세스 토큰 또는 서비스 키를 노출하지 않습니다.

파일 업로드

기술 원본을 만든 후 파일을 직접 업로드합니다. 각 업로드는 동기식 호출입니다. Azure AI 검색는 콘텐츠를 추출하고, 이를 청크로 분할하고, 필요할 때 임베딩을 생성하고, 청크를 인덱싱하고, 호출이 반환되기 전에 파일 메타데이터를 저장합니다. 별도의 수집 파이프라인을 구성하거나 실행할 필요가 없습니다.

파일 업로드 및 관리와 관련된 오류에 대한 도움말은 파일 작업 문제 해결을 참조하세요.

원시 파일 업로드

원시 업로드의 경우, 나열된 fileName 항목은 Content-Disposition: attachment; filename="..." 헤더에서 가져옵니다. REST 호출 및 .NET SDK는 이 헤더를 직접 설정하지만 Python SDK는 filename 매개 변수를 수락하고 헤더를 자동으로 빌드합니다. 파일 이름을 제공하지 않으면 서비스에서 자동 생성된 fileName이름을 할당합니다.

파일 이름에는 다음과 같은 manuals/installation-guide.pdf상대 경로가 포함될 수 있습니다. 서비스는 백슬래시(\)를 슬래시(/)로 정규화합니다. 절대 경로, 빈 경로 세그먼트 또는 .. 세그먼트, . 콜론이 포함된 세그먼트 및 HTTP 상태400의 잘못된 파일 이름 문자를 거부합니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

string fileName = "installation-guide.pdf";
byte[] fileBytes = await File.ReadAllBytesAsync(fileName);
string contentDisposition = $"attachment; filename=\"{fileName}\"";

KnowledgeSourceFile uploadedFile = (await indexClient.UploadKnowledgeSourceFileAsync(
    "my-file-ks",
    contentDisposition,
    BinaryData.FromBytes(fileBytes))).Value;

Console.WriteLine($"Uploaded file ID: {uploadedFile.FileId}");

참조:SearchIndexClient.UploadKnowledgeSourceFileAsync

from pathlib import Path

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

file_path = Path("installation-guide.pdf")
uploaded_file = index_client.upload_knowledge_source_file(
    "my-file-ks",
    file_path.read_bytes(),
    filename=file_path.name,
)
print(f"Uploaded file ID: {uploaded_file.file_id}")

참조:SearchIndexClient.upload_knowledge_source_file

POST {{search-endpoint}}/knowledgesources/my-file-ks/files?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="installation-guide.pdf"

<binary file content>

참조:기술 자료 - 파일 업로드

선택적 메타데이터를 사용하여 파일 업로드

2026-08-01-preview API 버전부터 다중 파트 요청을 사용하여 선택적 사용자 지정 메타데이터를 사용하여 하나의 이진 파일을 업로드합니다. 요청에는 정확히 한 content 부분과 선택적 JSON metadata 부분이 포함됩니다.

두 이름이 모두 지정된 경우 content 부분의 파일 이름보다 metadata.fileName가 우선합니다. 둘 다 지정하지 않으면 서비스는 자동 생성된 파일 이름을 할당합니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());
var metadata = new FileUploadMetadata
{
  FileName = "installation-guide.pdf",
  Metadata =
  {
    ["department"] = "support",
    ["product"] = "contoso-100"
  }
};

#pragma warning disable SCME0004
var request = new UploadKnowledgeSourceFileMultipartRequest(
  metadata,
  "installation-guide.pdf");
KnowledgeSourceFile uploadedFile = (await indexClient
  .UploadKnowledgeSourceFileMultipartAsync("my-file-ks", request)).Value;
#pragma warning restore SCME0004

Console.WriteLine($"Uploaded file ID: {uploadedFile.FileId}");

참조:SearchIndexClient.UploadKnowledgeSourceFileMultipartAsync

from pathlib import Path

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
  FileUploadMetadata,
  UploadKnowledgeSourceFileMultipartRequest,
)

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())
file_path = Path("installation-guide.pdf")
request = UploadKnowledgeSourceFileMultipartRequest(
  metadata=FileUploadMetadata(
    file_name=file_path.name,
    metadata={"department": "support", "product": "contoso-100"},
  ),
  content=(file_path.name, file_path.read_bytes(), "application/pdf"),
)

uploaded_file = index_client.upload_knowledge_source_file_multipart(
  name="my-file-ks",
  body=request,
)
print(f"Uploaded file ID: {uploaded_file.file_id}")

참조:SearchIndexClient.upload_knowledge_source_file_multipart

POST {{search-endpoint}}/knowledgesources('my-file-ks')/files?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: multipart/form-data; boundary=file-boundary

--file-boundary
Content-Disposition: form-data; name="metadata"
Content-Type: application/json

{
  "fileName": "installation-guide.pdf",
  "metadata": {
    "department": "support",
    "product": "contoso-100"
  }
}
--file-boundary
Content-Disposition: form-data; name="content"; filename="installation-guide.pdf"
Content-Type: application/octet-stream

< ./installation-guide.pdf
--file-boundary--

참조:기술 자료 - 파일 업로드

메모

파일을 업로드해도 동일한 fileName파일을 다시 사용하는 경우에도 기존 파일이 대체되지 않습니다. 업로드에 성공한 각 파일은 자체 fileId적으로 새 파일을 만들므로 업로드된 파일 목록에는 공유 fileName되는 여러 항목이 포함될 수 있습니다.

이전 2026-05-01-preview파일을 삭제하고 대체 파일을 업로드하여 콘텐츠를 바꿉니다. 2026-08-01-preview에서는 업데이트 작업을 사용하세요.

업로드된 파일 나열

지식 소스의 파일을 나열해 업로드된 파일 세트를 확인합니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

await foreach (KnowledgeSourceFile file in indexClient.GetKnowledgeSourceFilesAsync("my-file-ks"))
{
    Console.WriteLine($"{file.FileName} ({file.FileSizeBytes} bytes) error={file.ErrorMessage}");
}

참조:SearchIndexClient.GetKnowledgeSourceFilesAsync

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

for file in index_client.list_knowledge_source_files("my-file-ks"):
    print(f"{file.file_name} ({file.file_size_bytes} bytes) error={file.error_message}")

참조:SearchIndexClient.list_knowledge_source_files

GET {{search-endpoint}}/knowledgesources/my-file-ks/files?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}

참조:기술 자료 - 파일 나열

응답에는 업로드된 각 파일에 대한 메타데이터가 포함됩니다. 성공적으로 나열된 파일의 errorMessage 값은 null입니다.

{
  "value": [
    {
      "fileId": "file-abc123",
      "fileName": "installation-guide.pdf",
      "fileSizeBytes": 1048576,
      "createdAt": "2026-05-07T18:10:00Z",
      "lastUpdatedAt": "2026-05-07T18:14:00.803Z",
      "errorMessage": null
    }
  ]
}

새 업로드가 실패하면 요청이 오류를 반환하고 파일 메타데이터 레코드를 만들지 않습니다. 실패한 업로드는 이후 목록 결과에 표시되지 않으며 요금이 청구되지 않습니다.

모델 액세스 실패가 발생하고 포함 모델을 호스트하는 Foundry 리소스가 프라이빗 네트워킹을 사용하는 경우 공유 프라이빗 링크가 승인되고 신뢰할 수 있는 서비스 바이패스가 사용하도록 설정되어 있는지 foundry_account 확인합니다. 비활성화된 바이패스는 403 Public access is disabled를 반환합니다. 설치 세부 정보는 필수 구성 요소를 참조하세요.

파일 나열 및 필터링

2026-08-01-preview API 버전부터 상대 경로별로 파일을 필터링하거나 search 파일 이름 접두사를 기준으로 필터링하는 데 사용합니다prefix. 결과 수를 제어하도록 설정합니다 pageSize .

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

await foreach (KnowledgeSourceFile file in indexClient.GetKnowledgeSourceFilesAsync(
  "my-file-ks",
  prefix: "manuals/",
  pageSize: 100))
{
  Console.WriteLine($"{file.FileName} ({file.FileId})");
}

참조:SearchIndexClient.GetKnowledgeSourceFilesAsync

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

files = index_client.list_knowledge_source_files(
  "my-file-ks",
  prefix="manuals/",
  page_size=100,
)
for file in files:
  print(f"{file.file_name} ({file.file_id})")

참조:SearchIndexClient.list_knowledge_source_files

GET {{search-endpoint}}/knowledgesources('my-file-ks')/files?api-version=2026-08-01-preview&prefix=manuals/&pageSize=100
Authorization: Bearer {{search-access-token}}

참조:기술 자료 - 파일 나열

응답에는 서비스 선택 구문 분석 및 추출 모드와 파일 관리를 위한 사용자 메타데이터가 포함됩니다. 사용자 메타데이터는 검색하거나 필터링할 수 없습니다.

{
  "value": [
    {
      "fileId": "file-abc123",
      "fileName": "manuals/installation-guide.md",
      "prefix": "manuals/",
      "metadata": {
        "department": "support",
        "product": "contoso-100"
      },
      "parsingMode": "markdown",
      "extractionMode": "minimal",
      "fileSizeBytes": 1048576,
      "createdAt": "2026-08-03T18:10:00Z",
      "lastUpdatedAt": "2026-08-03T18:14:00Z",
      "errorMessage": null
    }
  ],
  "@odata.nextLink": "<service-generated continuation URL>"
}

모든 결과를 가져오려면 @odata.nextLink가 더 이상 없을 때까지 이를 따르세요. 쿼리 매개 변수를 변경하지 않고 반환된 대로 정확하게 전체 URL을 보냅니다.

업로드된 파일 업데이트

2026-08-01-preview API 버전부터는 fileId(으)로 파일을 업데이트합니다. 다중 파트 요청에는 이진 content 부분이 필요합니다. 메타데이터 JSON 부분은 선택 사항이므로 콘텐츠 전용 업데이트가 지원됩니다. 메타데이터 전용 업데이트는 지원되지 않습니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());
var metadata = new FileUploadMetadata
{
  FileName = "installation-guide.pdf",
  Metadata =
  {
    ["department"] = "support",
    ["product"] = "contoso-200"
  }
};

#pragma warning disable SCME0004
var request = new UpdateKnowledgeSourceFileRequest(
  metadata,
  "installation-guide.pdf");
KnowledgeSourceFile updatedFile = (await indexClient.UpdateKnowledgeSourceFileAsync(
  fileId,
  "my-file-ks",
  request)).Value;
#pragma warning restore SCME0004

Console.WriteLine($"Updated file ID: {updatedFile.FileId}");

참조:SearchIndexClient.UpdateKnowledgeSourceFileAsync

from pathlib import Path

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
  FileUploadMetadata,
  UpdateKnowledgeSourceFileRequest,
)

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())
file_path = Path("installation-guide.pdf")
request = UpdateKnowledgeSourceFileRequest(
  metadata=FileUploadMetadata(
    file_name=file_path.name,
    metadata={"department": "support", "product": "contoso-200"},
  ),
  content=(file_path.name, file_path.read_bytes(), "application/pdf"),
)

updated_file = index_client.update_knowledge_source_file(
  name="my-file-ks",
  file_id=file_id,
  body=request,
)
print(f"Updated file ID: {updated_file.file_id}")

참조:SearchIndexClient.update_knowledge_source_file

PUT {{search-endpoint}}/knowledgesources('my-file-ks')/files('{{file-id}}')?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: multipart/form-data; boundary=file-boundary

--file-boundary
Content-Disposition: form-data; name="metadata"
Content-Type: application/json

{
  "fileName": "installation-guide.pdf",
  "metadata": {
    "department": "support",
    "product": "contoso-200"
  }
}
--file-boundary
Content-Disposition: form-data; name="content"; filename="installation-guide.pdf"
Content-Type: application/octet-stream

< ./installation-guide.pdf
--file-boundary--

참조:기술 자료 - 파일 업데이트

업데이트가 실패하면 이전 메타데이터 레코드가 유지됩니다. 업데이트가 인덱싱된 콘텐츠를 트랜잭션적으로 변경한다고 가정하지 마세요.

업로드된 파일 삭제

더 이상 검색에 사용할 수 없도록 하려면 기술 원본에서 파일을 삭제합니다.

using Azure.Identity;
using Azure.Search.Documents.Indexes;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());

await indexClient.DeleteKnowledgeSourceFileAsync("my-file-ks", "file-abc123");

참조:SearchIndexClient.DeleteKnowledgeSourceFileAsync

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

index_client.delete_knowledge_source_file("my-file-ks", "file-abc123")

참조:SearchIndexClient.delete_knowledge_source_file

DELETE {{search-endpoint}}/knowledgesources/my-file-ks/files/file-abc123?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}

참조:기술 자료 - 파일 삭제

기술 자료에 할당

기술 자료에 만족하는 경우 기술 자료에 추가합니다.

지식 베이스 질의

기술 자료가 구성되면 검색 작업 또는 MCP 엔드포인트를 호출 하여 기술 자료를 쿼리합니다.

지식 원본 삭제

기술 자료를 삭제하려면 먼저 이를 참조하는 기술 자료를 삭제하거나 기술 자료 정의를 업데이트하여 참조를 제거해야 합니다. 인덱스 및 인덱서 파이프라인을 생성하는 기술 원본의 경우 생성된 모든 개체 도 삭제됩니다. 그러나 기존 인덱스로 기술 원본을 만든 경우 인덱스가 삭제되지 않습니다.

사용 중인 기술 원본을 삭제하려고 하면 작업이 실패하고 영향을 받는 기술 자료 목록이 반환됩니다.

기술 자료를 삭제하려면 다음을 수행합니다.

  1. 검색 서비스의 모든 기술 자료 목록을 가져옵니다.

    using Azure.Search.Documents.Indexes;
    
    var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);
    var knowledgeBases = indexClient.GetKnowledgeBasesAsync();
    
    Console.WriteLine("Knowledge Bases:");
    
    await foreach (var kb in knowledgeBases)
    {
        Console.WriteLine($"  - {kb.Name}");
    }
    

    참조:SearchIndexClient

    예제 응답은 다음과 같을 수 있습니다.

     {
         "@odata.context": "https://my-search-service.search.windows.net/$metadata#knowledgebases(name)",
         "value": [
         {
             "name": "my-kb"
         },
         {
             "name": "my-kb-2"
         }
         ]
     }
    
  2. 개별 기술 자료 정의를 가져와서 기술 자료 참조를 확인합니다.

    using Azure.Search.Documents.Indexes;
    using System.Text.Json;
    
    var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);
    
    // Specify the knowledge base name to retrieve
    string kbNameToGet = "earth-knowledge-base";
    
    // Get a specific knowledge base definition
    var knowledgeBaseResponse = await indexClient.GetKnowledgeBaseAsync(kbNameToGet);
    var kb = knowledgeBaseResponse.Value;
    
    // Serialize to JSON for display
    string json = JsonSerializer.Serialize(kb, new JsonSerializerOptions { WriteIndented = true });
    Console.WriteLine(json);
    

    참조:SearchIndexClient

    예제 응답은 다음과 같을 수 있습니다.

     {
       "Name": "earth-knowledge-base",
       "KnowledgeSources": [
         {
           "Name": "earth-knowledge-source"
         }
       ],
       "Models": [
         {}
       ],
       "RetrievalReasoningEffort": {},
       "OutputMode": {},
       "ETag": "\u00220x8DE278629D782B3\u0022",
       "EncryptionKey": null,
       "Description": null,
       "RetrievalInstructions": null,
       "AnswerInstructions": null
     }
    
  3. 기술 자료를 삭제하거나 여러 기술 자료가 있는 경우 기술 자료를 업데이트하여 원본을 제거합니다. 이 예제에서는 삭제를 보여줍니다.

    using Azure.Search.Documents.Indexes;
    var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);
    
    await indexClient.DeleteKnowledgeBaseAsync(knowledgeBaseName);
    System.Console.WriteLine($"Knowledge base '{knowledgeBaseName}' deleted successfully.");
    

    참조:SearchIndexClient

  4. 기술 자료를 삭제합니다.

    await indexClient.DeleteKnowledgeSourceAsync(knowledgeSourceName);
    System.Console.WriteLine($"Knowledge source '{knowledgeSourceName}' deleted successfully.");
    

    참조:SearchIndexClient

  1. 검색 서비스의 모든 기술 자료 목록을 가져옵니다.

    # Get knowledge bases
    from azure.core.credentials import AzureKeyCredential
    from azure.search.documents.indexes import SearchIndexClient
    
    index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))
    
    print("Knowledge Bases:")
    for kb in index_client.list_knowledge_bases():
        print(f"  - {kb.name}")
    

    참조:SearchIndexClient

    예제 응답은 다음과 같을 수 있습니다.

     {
         "@odata.context": "https://my-search-service.search.windows.net/$metadata#knowledgebases(name)",
         "value": [
         {
             "name": "my-kb"
         },
         {
             "name": "my-kb-2"
         }
         ]
     }
    
  2. 개별 기술 자료 정의를 가져와서 기술 자료 참조를 확인합니다.

    # Get a knowledge base definition
    from azure.core.credentials import AzureKeyCredential
    from azure.search.documents.indexes import SearchIndexClient
    
    index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))
    kb = index_client.get_knowledge_base("knowledge_base_name")
    print(kb)
    

    참조:SearchIndexClient

    예제 응답은 다음과 같을 수 있습니다.

     {
       "name": "my-kb",
       "description": null,
       "retrievalInstructions": null,
       "answerInstructions": null,
       "outputMode": null,
       "knowledgeSources": [
         {
           "name": "my-blob-ks"
         }
       ],
       "models": [],
       "encryptionKey": null,
       "retrievalReasoningEffort": {
         "kind": "low"
       }
     }
    
  3. 기술 자료를 삭제하거나 여러 기술 자료가 있는 경우 기술 자료를 업데이트하여 원본을 제거합니다. 이 예제에서는 삭제를 보여줍니다.

    # Delete a knowledge base
    from azure.core.credentials import AzureKeyCredential 
    from azure.search.documents.indexes import SearchIndexClient
    
    index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))
    index_client.delete_knowledge_base("knowledge_base_name")
    print(f"Knowledge base deleted successfully.")
    

    참조:SearchIndexClient

  4. 기술 자료를 삭제합니다.

    # Delete a knowledge source
    from azure.core.credentials import AzureKeyCredential 
    from azure.search.documents.indexes import SearchIndexClient
    
    index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))
    index_client.delete_knowledge_source("knowledge_source_name")
    print(f"Knowledge source deleted successfully.")
    

    참조:SearchIndexClient

  1. 검색 서비스의 모든 기술 자료 목록을 가져옵니다.

    ### Get knowledge bases
    GET {{search-url}}/knowledgebases?api-version={{api-version}}&$select=name
    Authorization: Bearer {{token}}
    

    참조:기술 자료 - 목록

    예제 응답은 다음과 같을 수 있습니다.

     {
         "@odata.context": "https://my-search-service.search.windows.net/$metadata#knowledgebases(name)",
         "value": [
         {
             "name": "my-kb"
         },
         {
             "name": "my-kb-2"
         }
         ]
     }
    
  2. 개별 기술 자료 정의를 가져와서 기술 자료 참조를 확인합니다.

    ### Get a knowledge base definition
    GET {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
    Authorization: Bearer {{token}}
    

    참조:기술 자료 - 가져오기

    예제 응답은 다음과 같을 수 있습니다.

     {
       "name": "my-kb",
       "description": null,
       "retrievalInstructions": null,
       "answerInstructions": null,
       "outputMode": null,
       "knowledgeSources": [
         {
           "name": "my-blob-ks"
         }
       ],
       "models": [],
       "encryptionKey": null,
       "retrievalReasoningEffort": {
         "kind": "low"
       }
     }
    
  3. 기술 자료를 삭제하거나 여러 기술 자료가 있는 경우 기술 자료를 업데이트하여 원본을 제거합니다. 이 예제에서는 삭제를 보여줍니다.

    ### Delete a knowledge base
    DELETE {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
    Authorization: Bearer {{token}}
    

    참조:기술 자료 - 삭제

  4. 기술 자료를 삭제합니다.

    ### Delete a knowledge source
    DELETE {{search-url}}/knowledgesources/{{knowledge-source-name}}?api-version={{api-version}}
    Authorization: Bearer {{token}}
    

    참조:기술 자료 - 삭제

파일 작업 문제 해결

다음 상태 코드는 파일 기술 자료 작업과 관련이 있습니다.

상태 코드 원인 및 조치
400 파일이 비어 있거나, 추출할 수 있는 텍스트가 없거나, 안전하지 않은 상대 경로가 있거나, 연속 요청이 잘못되었습니다. 파일에 지원되고 읽을 수 있는 콘텐츠와 유효한 파일 이름이 있는지 확인합니다. 목록 작업의 경우 반환된 대로 정확하게 따릅니다 @odata.nextLink . $skiptoken를 search 또는 pageSize와 결합하지 마세요.
409 파일 지식 원본이 API 버전의 파일 제한에 도달했습니다. 더 업로드하기 전에 파일을 삭제합니다.
415 서비스에서 지원되지 않는 MIME 형식을 감지했거나, 지식 원본이 최소 추출을 사용하는 경우 이미지를 감지했습니다. 지원되는 형식을 사용합니다. 이미지의 경우 표준 추출을 사용합니다. 호출자가 제공한 콘텐츠 유형만 변경하는 것만으로는 감지를 재정의할 수 없습니다.
429 처리 큐가 가득 찼습니다. 병렬 처리 수준을 제한하고 지수 백오프 방식으로 재시도하세요. 서비스는 Retry-After 헤더를 보장하지 않습니다.
504 파일 업로드 또는 업데이트 중 처리가 180초를 초과했습니다. 파일 크기 또는 복잡성을 줄이고 다시 시도합니다.