文档管理

更新时间:
复制为 MD 格式

通过以下接口管理知识库中的文档:导入文档、查询状态、列出文档、更新元数据、删除文档。

支持文档格式

  • PDF:.pdf

  • Word:.doc.docx

  • Excel:.xls.xlsx

  • PowerPoint:.ppt.pptx

  • 纯文本:.txt

  • Markdown:.md

文档状态流转

文档从上传到可检索,经历以下状态:

状态

说明

可执行的操作

Pending

上传任务已接收,等待处理

查询状态、删除

Indexing

正在解析、切片和向量化

查询状态、删除

Completed

索引完成,可被检索

检索、更新元数据、删除、查看切片

Failed

索引失败

查看失败原因、删除、重新上传

Deleting

文档及其切片正在删除

等待删除完成

说明

文档上传后处于 PendingIndexing 状态时无法被检索到。必须等到状态变为 Completed 才能检索。

添加文档

将文档导入知识库。系统自动完成解析、切片、Embedding 向量化和索引构建。相同 ossKey 重复上传会覆盖原有文档。

SDK 提供三种导入方式:

方式

SDK 方法

说明

上传本地文件

upload_documents()

指定本地文件路径,SDK 自动上传至 OSS 后添加到知识库

添加 OSS 文件

add_documents()

指定已存在的 OSS 文件路径

OSS 目录批量导入

add_documents()

指定 OSS 目录路径,系统递归扫描所有文件

请求参数

参数

类型

说明

knowledgeBaseName

string

知识库名称(必填)

subspace

string

子空间名称,最大 128 字符。开启 subspace 时必填

documents

list<object>

文档列表(必填)。单次最多 10 个

documents[].filePath

string

本地文件路径。upload_documents 时必填

documents[].ossKey

string

OSS 文件或目录路径,长度 1–256。add_documents 时必填

documents[].metadata

object

文档元数据,必须与知识库定义的 metadata schema 一致

documents[].inclusionFilters

list<string>

包含过滤器,支持首尾 * 通配符(如*.pdf),用于 OSS 目录扫描

documents[].exclusionFilters

list<string>

排除过滤器,支持首尾 * 通配符(如*draft*

代码示例

上传本地文件

指定本地文件路径,SDK 自动完成“上传 OSS → 添加到知识库”。

说明

使用 upload_documents 时,初始化 AgentStorageClient 需同时提供 oss_endpointoss_bucket_name,否则抛出 ValueError

resp = client.upload_documents({
    "knowledgeBaseName": "product_docs_kb",
    "documents": [
        {
            "filePath": "/home/user/docs/product_manual.pdf",
            "metadata": {"author": "张三", "category": "产品文档"}
        },
        {
            "filePath": "/home/user/docs/faq.docx",
            "metadata": {"author": "李四", "category": "FAQ"}
        }
    ]
})

添加 OSS 文件

文件已在 OSS 上时,直接指定 ossKey

resp = client.add_documents({
    "knowledgeBaseName": "product_docs_kb",
    "documents": [
        {
            "ossKey": "oss://example-bucket/docs/product_manual.pdf",
            "metadata": {"author": "张三"}
        }
    ]
})

OSS 目录批量导入

指定 OSS 目录路径,系统递归扫描目录下所有文件。通过 inclusionFiltersexclusionFilters 按文件名模式过滤。

resp = client.add_documents({
    "knowledgeBaseName": "product_docs_kb",
    "documents": [
        {
            "ossKey": "oss://example-bucket/docs/",
            "inclusionFilters": ["*.pdf", "*.docx"],
            "exclusionFilters": ["*draft*"]
        }
    ]
})

响应说明

响应字段

字段

类型

说明

documentDetails

list<object>

每个文档的处理结果

documentDetails[].docId

string

文档 ID

documentDetails[].ossKey

string

文档 OSS 路径

documentDetails[].status

string

succeedfailed

documentDetails[].failureReason

string

失败原因(仅 failed 时)

响应示例

{
  "code": "SUCCESS",
  "data": {
    "documentDetails": [
      {"docId": "fc6ed97f-...", "status": "succeed", "ossKey": "oss://example-bucket/docs/product_manual.pdf"},
      {"docId": "940f2c5c-...", "status": "succeed", "ossKey": "oss://example-bucket/docs/faq.docx"}
    ]
  },
  "message": "succeed"
}

部分失败响应(HTTP 仍返回 200,code 仍为 SUCCESS):

{
  "code": "SUCCESS",
  "data": {
    "documentDetails": [
      {"status": "failed", "failureReason": "Metadata field 'date' date string format is not supported", "ossKey": "oss://..."},
      {"status": "succeed", "ossKey": "oss://...", "docId": "940f2c5c-..."}
    ]
  },
  "message": "succeed"
}

注意事项

  • HTTP 200 + code: SUCCESS 不代表所有文档都处理成功。必须逐个检查 documentDetails 中每个文档的 status 字段。

  • status: "succeed" 表示上传任务已接收,并非索引完成。必须等到文档状态变为 Completed 才能被检索。

  • 知识库开启 subspace 后必须传 subspace 参数,否则报 INVALID_PARAMETER

  • metadata 日期格式需使用支持的格式(如 yyyy-MM-dd HH:mm:ss),不支持的格式会导致文档 failed

  • 单次请求最多 10 个文档,单文件最大 50MB。

查询索引状态

文档上传后经过异步处理才能被检索。如需确认文档是否索引完成,建议采用指数退避轮询。

import time

def wait_for_document(client, kb_name, doc_id, max_interval=30):
    """指数退避轮询文档状态,等待索引完成。"""
    interval = 3
    while True:
        resp = client.get_document({
            "knowledgeBaseName": kb_name,
            "docId": doc_id
        })
        status = resp["data"][0]["status"]
        if status == "completed":
            print(f"索引完成,切片数: {resp['data'][0].get('chunkNum', 'N/A')}")
            return resp
        elif status == "failed":
            raise Exception(f"索引失败: {resp['data'][0].get('failedDetails')}")
        print(f"当前状态: {status},{interval}s 后重试...")
        time.sleep(interval)
        interval = min(interval * 2, max_interval)

文档处理时间受文件大小、类型和数量影响,小文件通常几秒完成,大文件或批量导入可能需要数分钟。

查询文档

调用 get_document 查询指定文档的详细信息,包括处理状态、切片数量和元数据。

请求参数

参数

类型

说明

knowledgeBaseName

string

知识库名称(必填)

subspace

string

子空间名称。开启 subspace 时必填

docId

string

文档 ID。ossKey 二选一

ossKey

string

OSS 文件路径。docId 二选一

代码示例

resp = client.get_document({
    "knowledgeBaseName": "product_docs_kb",
    "docId": "fc6ed97f-..."
})

doc = resp["data"][0]
print(f"状态: {doc['status']}, 切片数: {doc.get('chunkNum', 'N/A')}")

响应说明

字段

类型

说明

docId

string

文档 ID

ossKey

string

OSS 路径

subspace

string

子空间

chunkNum

int

切片数量

status

string

文档状态:Pending/Indexing/Completed/Failed/Deleting

createdAt

int

创建时间戳

updatedAt

int

更新时间戳

eTag

string

文档 eTag

failedDetails

string

失败原因(仅 Failed 时)

metadata

object

文档元数据

注意事项

同一个 ossKey 经历创建→删除→创建后,get_document 可能返回多条记录(包含历史记录)。根据 status 字段判断有效文档,取 Completed 状态的记录。

列出文档

调用 list_documents 分页查询知识库下的文档列表。

请求参数

参数

类型

说明

knowledgeBaseName

string

知识库名称(必填)

subspace

list<string>

子空间列表,最多 10 个。开启 subspace 时必填

maxResults

int

返回数量。默认为 10,最大 1000

nextToken

string

翻页 token

代码示例

resp = client.list_documents({
    "knowledgeBaseName": "product_docs_kb",
    "maxResults": 20
})

for doc in resp["data"]["documentDetails"]:
    print(f"[{doc['status']}] {doc['ossKey']} (切片数: {doc.get('chunkNum', '-')})")

注意事项

subspace 参数支持多值列表,但最多 10 个,超过会报错。

更新文档元数据

调用 update_document 更新指定文档的 metadata。

说明

Completed 状态的文档可更新元数据。对其他状态的文档调用会报错。

请求参数

参数

类型

说明

knowledgeBaseName

string

知识库名称(必填)

subspace

string

子空间名称。开启 subspace 时必填

ossKey

string

文档 OSS 路径。docId 二选一

docId

string

文档 ID。ossKey 二选一

metadata

map

新的 metadata(必填)

代码示例

resp = client.update_document({
    "knowledgeBaseName": "product_docs_kb",
    "docId": "fc6ed97f-...",
    "metadata": {"author": "张三", "category": "技术文档", "version": 2}
})

print(f"更新状态: {resp['data']['updateStatus']}")  # UPDATED 或 NO_OP

响应说明

字段

类型

说明

docId

string

文档 ID

ossKey

string

OSS 路径

updatedAt

long

更新时间戳

updateStatus

string

NO_OPUPDATED

注意事项

  • metadata 采用覆盖式更新,传入的值会全量替换原有 metadata。如果只想更新一个字段,必须把所有字段都带上。

  • 传入 "metadata": null 会清空所有 metadata。

  • 不传 metadata 字段则保留原值。

  • 限制:metadata 总大小(key + value)最大 4KB,字段数最多 200 个。

删除文档

调用 delete_documents 删除指定的文档及其所有切片数据。

请求参数

参数

类型

说明

knowledgeBaseName

string

知识库名称(必填)

subspace

string

子空间名称。开启 subspace 时必填

documents

list<object>

要删除的文档列表(必填)

documents[].docId

string

文档 ID。ossKey 二选一

documents[].ossKey

string

OSS 路径。docId 二选一

代码示例

resp = client.delete_documents({
    "knowledgeBaseName": "product_docs_kb",
    "documents": [
        {"docId": "fc6ed97f-..."},
        {"ossKey": "oss://example-bucket/docs/faq.docx"}
    ]
})

# 逐个检查删除结果
for detail in resp["data"]["documentDetails"]:
    print(f"{detail['ossKey']}: {detail['status']}")

注意事项

同 AddDocuments,删除结果也需逐个检查 documentDetails 中每个文档的 status

相关文档