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

LangChain集成LlamaCpp流式输出丢失换行符问题求助

解决LlamaCpp流式输出缺失换行符的问题

问题分析

流式输出中换行符丢失,导致文本挤成一整段,但控制台输出和完整响应均包含正常换行符,说明问题出在流式输出的处理环节,而非模型本身的输出。

解决方案

1. 修正流式输出的内容处理

llm.stream()返回的每个元素需要显式提取文本内容并保留换行符。修改generateStreamingOutput函数:

async def generateStreamingOutput(llm, question):
    for item in llm.stream(json.dumps(question), stop=['Question:']):
        # 提取item中的文本内容,确保换行符被保留
        content = getattr(item, 'text', str(item))
        yield content
    return EventSourceResponse(generateStreamingOutput(llm, question))

如果是网页前端展示场景,可将换行符转换为HTML格式的换行:

content = getattr(item, 'text', str(item)).replace('\n', '<br>')

2. 调整LlamaCpp初始化参数

尝试移除stream_prefix=True参数,该参数可能干扰流式输出的格式处理:

def get70BGPULLMObject():
    callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
    llm = LlamaCpp(model_path=llm_model_path,
                   temperature=0,
                   n_gpu_layers=83,
                   n_ctx=4096,
                   max_tokens=4096,
                   n_batch=2048,
                   n_gqa=8,
                   verbose=True,
                   callback_manager=callback_manager,
                   streaming=True
                   )
    return llm

3. 验证原始输出内容

在循环中打印原始输出的字符表示,确认换行符是否存在:

async def generateStreamingOutput(llm, question):
    for item in llm.stream(json.dumps(question), stop=['Question:']):
        content = getattr(item, 'text', str(item))
        print(repr(content))  # 查看原始字符,确认是否包含\n
        yield content
    return EventSourceResponse(generateStreamingOutput(llm, question))

如果控制台打印显示存在\n但前端无换行,需在前端处理换行(如文本区域启用自动换行,或替换\n为<br>)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:07:48