我需要在 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 路由)中继续和实现这一点。如果我需要一个加载器,我不知道如何实现它。
这可能对你有帮助
更新 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;
服务器端执行
确保嵌入代码在服务器端运行。更新您的 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 });
}
}