FastGPT icon indicating copy to clipboard operation
FastGPT copied to clipboard

为什么加载的知识库比较多时,输出的内容就经常截断?

Open kynow2 opened this issue 1 year ago • 4 comments

为什么加载的知识库比较多时,输出的内容就经常截断? 比如问一个问题,如果是知识库里就1~2本书,大模型就会比较完整地输出内容,而如果知识库里的内容比较多,大模型输出总是输出一半就不输出了。 显卡4090*2,max-model-len 18048 足够支持长文本。 只要知识库内容一多,就会犯这种错。

麻烦看下,是否有什么解决方案? imageimage image

kynow2 avatar Jul 19 '24 07:07 kynow2

总token超了,比如你设定模型输入加输出是8000token,你输入了7000,要求输出2000,输出到1000的时候就会超总token

lijiajun1997 avatar Jul 25 '24 03:07 lijiajun1997

总token超了,比如你设定模型输入加输出是8000token,你输入了7000,要求输出2000,输出到1000的时候就会超总token

谢谢回复,但我的总token设置了18000,索引字数在4000多,足够它发挥了

kynow2 avatar Jul 25 '24 08:07 kynow2

image 我这边也发现有这个问题,请求实际是完成的,但是不知道是不是网络原因,他的请求是一批一批过来的,中间隔了几秒,然后间隔之后就可能不输出了,前后端都没有看到任何报错。刷新下页面后面的内容又显示全了。

HOUTASU avatar Jul 26 '24 09:07 HOUTASU

https://github.com/labring/FastGPT/issues/2093#issuecomment-2252355026 这个问题我已经解决,是系统bug,需要在模型流式输出那里对模型速率做统一处理,优化控制输出速率的函数,统一限制输出的速率(例如每 20ms 输出一个字),可以参考我的代码

async function streamResponse({
  res,
  detail,
  response
}: {
res: NextApiResponse;
detail: boolean;
response: any;
}) {
  let answer = '';
  let error: any = null;
  const parseData = new SSEParseData();
  // 控制输出速率的函数
  const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
  try {
    for await (const chunk of response.data  as any) {
      if (res.closed)  break;
      const parse = parseStreamChunk(chunk);
      // 用 for...of 替代 forEach 以支持 await
      for (const item of parse) {
        const { data } = parseData.parse(item);
        if (!data || data === '[DONE]') {
          // 确保即使遇到 [DONE] 也返回包含 answer 属性的对象
          return { answer };
        }
        const content: string = data?.choices?.[0]?.delta?.content || '';
        error = data.error;
        answer += content;
        // 逐字输出并控制速率
        for (let i = 0; i < content.length;  i++) {
          // 检查连接是否已关闭
          if (res.closed)  break;

          sseResponse({
            res,
            event: detail? sseResponseEventEnum.answer  : undefined,
            data: textAdaptGptResponse({
              text: content[i]
            })
          });

          // 控制输出速率(例如每 20ms 输出一个字)
          await delay(20);
        }
      }
    }
  } catch (error) {
    console.log('pipe  error', error);
  }

mesenOne avatar Apr 08 '25 02:04 mesenOne