为什么加载的知识库比较多时,输出的内容就经常截断?
为什么加载的知识库比较多时,输出的内容就经常截断? 比如问一个问题,如果是知识库里就1~2本书,大模型就会比较完整地输出内容,而如果知识库里的内容比较多,大模型输出总是输出一半就不输出了。 显卡4090*2,max-model-len 18048 足够支持长文本。 只要知识库内容一多,就会犯这种错。
麻烦看下,是否有什么解决方案?
总token超了,比如你设定模型输入加输出是8000token,你输入了7000,要求输出2000,输出到1000的时候就会超总token
总token超了,比如你设定模型输入加输出是8000token,你输入了7000,要求输出2000,输出到1000的时候就会超总token
谢谢回复,但我的总token设置了18000,索引字数在4000多,足够它发挥了
我这边也发现有这个问题,请求实际是完成的,但是不知道是不是网络原因,他的请求是一批一批过来的,中间隔了几秒,然后间隔之后就可能不输出了,前后端都没有看到任何报错。刷新下页面后面的内容又显示全了。
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);
}