NextJS Transformers 模块解析失败:意外字符

问题描述 投票:0回答:1

我需要在 NextJS 15 中创建嵌入,所以我开始研究 @xenova/transformers@huggingface/transformers。在 Node 脚本中实现太简单了(没有 NextJS),但我正在努力完成这项工作。

创建项目后,我像往常一样创建了一个 API 路由 (

/app/api/route.ts
) 并继续执行给定的示例:

import { pipeline } from '@huggingface/transformers'

export async function GET() {
    const extractor = await pipeline(
        'feature-extraction',
        'Xenova/all-MiniLM-L6-v2'
    )

    const sentences = ['This is an example sentence', 'Each sentence is converted'];
    const output = await extractor(sentences, { pooling: 'mean', normalize: true });

    console.log(output)
}

但是当我访问 API URL 时,我收到此错误:

./node_modules/@huggingface/transformers/node_modules/onnxruntime-node/bin/napi-v3/darwin/arm64/onnxruntime_binding.node 模块解析失败:意外字符“�”(1:0) 您可能需要适当的加载程序来处理此文件类型,目前没有配置加载程序来处理此文件。请参阅https://webpack.js.org/concepts#loaders (此二进制文件省略源代码)

我还尝试使用以下内容更新下一个配置文件

next.config.ts

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  output: 'standalone',
  serverExternalPackages: ['sharp', 'onnxruntime-node'] 
};

export default nextConfig;

我真的不知道如何在服务器端(API 路由)中继续和实现这一点。如果我需要一个加载器,我不知道如何实现它。

javascript node.js typescript next.js huggingface-transformers
1个回答
0
投票

这可能对你有帮助

  1. 更新 Next.js 配置
    调整您的

    next.config.js
    以将
    onnxruntime-node
    从 Webpack 捆绑中排除。这可确保二进制文件被视为本机 Node.js 模块:

    const nextConfig = {
      output: 'standalone',
      webpack: (config, { isServer }) => {
        if (isServer) {
          config.externals = {
            ...config.externals,
            'onnxruntime-node': 'commonjs onnxruntime-node',
          };
        }
        return config;
      },
    };
    
    export default nextConfig;
    
  2. 服务器端执行
    确保嵌入代码在服务器端运行。更新您的 API 路由以在 Node.js 环境中正确使用

    onnxruntime-node

    import { pipeline } from '@huggingface/transformers';
    
    export async function GET() {
      try {
        const extractor = await pipeline(
          'feature-extraction',
          'Xenova/all-MiniLM-L6-v2'
        );
    
        const sentences = ['This is an example sentence', 'Each sentence is converted'];
        const output = await extractor(sentences, { pooling: 'mean', normalize: true });
    
        return new Response(JSON.stringify(output), { status: 200 });
      } catch (error) {
        console.error('Error:', error);
        return new Response('Error generating embeddings', { status: 500 });
      }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.