You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Allow Skillset to read file data后,自定义WebApiSkill读取PDF遇NotFound错误

问题排查与解决方案

一、先解决WebApiSkill的NotFound错误

排查步骤:

  • 检查Endpoint配置准确性:确认WebApiSkill的uri是否完全匹配你的Python函数公网地址,比如Azure Function的地址格式是https://<函数应用名>.azurewebsites.net/api/<函数名>,别漏掉api/前缀,也不要写错函数名或域名。
  • 验证权限配置:如果你的函数启用了密钥验证,必须在WebApiSkill的httpHeaders里添加正确的授权头,比如{"x-functions-key": "<你的函数密钥>"},密钥错误或缺失会导致请求被拦截,部分场景下会返回404而非403。
  • 确认输入映射有效性:临时关闭projections(或使用索引器的「测试技能集」功能),检查索引器处理的文档是否包含file_data字段——如果该字段不存在,技能集请求可能因输入为空触发异常,间接导致404。
  • 测试函数独立可用性:用Postman或curl构造符合技能集格式的请求(参考下方示例)直接调用函数,看是否能正常响应。如果直接调用也返回404,说明函数本身的路由或部署有问题。

示例测试请求体:

{
  "values": [
    {
      "recordId": "test1",
      "data": {
        "file_data": "<你的测试PDF base64字符串>"
      }
    }
  ]
}

二、正确读取Blob原始PDF文件的流程

核心要点:

  1. 明确file_data的格式:索引器传递的/document/file_data是base64编码的二进制文件内容,必须先解码才能处理。
  2. Python函数正确处理逻辑:解码base64字符串为字节流,再用PDF处理库(如PyPDF2、pdfplumber)读取内容,最后返回符合技能集要求的JSON格式。

示例Python函数代码:

import azure.functions as func
import base64
import json
from PyPDF2 import PdfReader
import io

def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        req_body = req.get_json()
        # 提取技能集传入的file_data
        record = req_body["values"][0]
        file_data_base64 = record["data"]["file_data"]
        
        # Base64解码为字节流
        file_bytes = base64.b64decode(file_data_base64)
        pdf_stream = io.BytesIO(file_bytes)
        
        # 读取PDF文本内容
        reader = PdfReader(pdf_stream)
        extracted_text = ""
        for page in reader.pages:
            page_text = page.extract_text()
            if page_text:
                extracted_text += page_text + "\n"
        
        # 返回符合技能集规范的响应
        return func.HttpResponse(
            json.dumps({
                "values": [
                    {
                        "recordId": record["recordId"],
                        "data": {"extracted_text": extracted_text},
                        "errors": [],
                        "warnings": []
                    }
                ]
            }),
            mimetype="application/json"
        )
    except Exception as e:
        # 异常处理,返回错误信息(生产环境可隐藏具体异常)
        record_id = record["recordId"] if "record" in locals() else "unknown"
        return func.HttpResponse(
            json.dumps({
                "values": [
                    {
                        "recordId": record_id,
                        "data": {},
                        "errors": [{"message": f"处理失败: {str(e)}"}],
                        "warnings": []
                    }
                ]
            }),
            status_code=500,
            mimetype="application/json"
        )

额外注意事项:

  • 确保函数依赖的库(如PyPDF2)已在requirements.txt中声明,部署时会自动安装。
  • 若PDF文件较大,需调整Azure Function的内存配置和技能集的timeout参数,避免超时。
  • 开启函数的日志监控(Azure门户→函数应用→监控→日志),查看请求详情和执行异常,这是排查问题最直接的方式。

内容的提问来源于stack exchange,提问作者Mike B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:55:02