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

React.js中Bert QnA模型无法返回回答的问题求助

问题:TensorFlow QnA模型调用后始终返回空数组

基于React.js搭建基础问答应用,按教程完成代码编写后,输入段落Internet is good和问题How is internet?,调用model.findAnswers()后返回结果始终为空数组[],相关代码如下:

import { useRef, useEffect, useState } from 'react';
import * as tf from '@tensorflow/tfjs';
import * as qna from '@tensorflow-models/qna';

function App() {
  const [model, setModel] = useState(null);
  const [answer, setAnswer] = useState([]);

  const [passage, setPassage] = useState('');
  const [question, setQuestion] = useState('');

  const loadModel = async () => {
    const loadedModel = await qna.load();
    setModel(loadedModel);
  };

  useEffect(() => {
    loadModel();
  }, []);

  const answerQuestions = async (e) => {
    if (e.which === 13 && model !== null) {
      const answers = await model.findAnswers(passage, question);
      setAnswer(answers);
      console.log(answers); // Always []
    }
  };

  return (
    <div className='App'>
      <header className='App-header'>
        {model !== null ? (
          <div>
            <div>
              <div>Passage</div>
              <textarea
                onChange={(e) => {
                  setPassage(e.target.value);
                }}
                className='border border-black'
                row='30'
                cols='100'
              ></textarea>
            </div>
            <div>
              <div>Ask question</div>
              <input
                onChange={(e) => {
                  setQuestion(e.target.value);
                }}
                type='text'
                className='border border-black'
                onKeyPress={answerQuestions}
              />
            </div>
          </div>
        ) : (
          <div>Loading..</div>
        )}
        {answer.length > 0 && (
          <div>
            {answer.map((e) => {
              return <div>{e.text}</div>;
            })}
          </div>
        )}
      </header>
    </div>
  );
}

export default App;

解决方案

1. 降低模型置信度阈值

TensorFlow QnA模型默认的置信度阈值较高,短段落的匹配结果容易因置信度不足被过滤。调用findAnswers时手动设置threshold参数降低阈值,比如设为0.1:

const answers = await model.findAnswers(passage, question, { threshold: 0.1 });

2. 优化问题表述

模型更擅长匹配能从段落中提取精确片段的提问,将原问题How is internet?调整为更贴合段落内容的表述,比如:

  • What is the internet like?
  • Is the internet good?

3. 修正textarea属性错误

代码中textarea的row属性应为复数rows,否则可能导致输入区域显示异常,影响内容输入:

<textarea
  onChange={(e) => {
    setPassage(e.target.value);
  }}
  className='border border-black'
  rows='30'
  cols='100'
></textarea>

修复后的完整代码

import { useEffect, useState } from 'react';
import * as tf from '@tensorflow/tfjs';
import * as qna from '@tensorflow-models/qna';

function App() {
  const [model, setModel] = useState(null);
  const [answer, setAnswer] = useState([]);

  const [passage, setPassage] = useState('');
  const [question, setQuestion] = useState('');

  const loadModel = async () => {
    const loadedModel = await qna.load();
    setModel(loadedModel);
  };

  useEffect(() => {
    loadModel();
  }, []);

  const answerQuestions = async (e) => {
    if (e.which === 13 && model !== null) {
      const answers = await model.findAnswers(passage, question, { threshold: 0.1 });
      setAnswer(answers);
      console.log(answers);
    }
  };

  return (
    <div className='App'>
      <header className='App-header'>
        {model !== null ? (
          <div>
            <div>
              <div>Passage</div>
              <textarea
                onChange={(e) => setPassage(e.target.value)}
                className='border border-black'
                rows='30'
                cols='100'
              ></textarea>
            </div>
            <div>
              <div>Ask question</div>
              <input
                onChange={(e) => setQuestion(e.target.value)}
                type='text'
                className='border border-black'
                onKeyPress={answerQuestions}
              />
            </div>
          </div>
        ) : (
          <div>Loading..</div>
        )}
        {answer.length > 0 && (
          <div>
            {answer.map((item, index) => (
              <div key={index}>{item.text}</div>
            ))}
          </div>
        )}
      </header>
    </div>
  );
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:43:22