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

如何在FastAPI中实现Llama-Index响应流式输出?报错解决与Flask方案

解决FastAPI流式输出的TypeError问题,附Flask实现方案

FastAPI 报错解决:TypeError: cannot pickle 'generator' object

这个报错的核心原因很直接:Llama-Index返回的流式输出是生成器对象,而FastAPI默认的响应处理逻辑会尝试对返回值做pickle序列化,但生成器本身没法被pickle,直接返回就会触发报错。

正确实现方式

用FastAPI自带的StreamingResponse包裹生成器,它会直接迭代生成器输出内容,跳过序列化步骤。同时要设置合适的媒体类型:如果前端用SSE接收就设text/event-stream,普通流式文本用text/plain即可。

完整示例代码:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

app = FastAPI()

# 初始化Llama-Index索引,和本地逻辑一致
documents = SimpleDirectoryReader("your_data_folder").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(streaming=True)

def stream_response(query: str):
    # 调用Llama-Index流式查询接口
    response = query_engine.query(query)
    # 逐个返回生成器中的token
    for token in response.response_gen:
        yield token
        # 如果是SSE格式,改成:yield f"data: {token}\n\n"

@app.get("/stream-qa")
async def get_stream_qa(query: str):
    return StreamingResponse(stream_response(query), media_type="text/event-stream")

重点提醒

  • 必须用StreamingResponse包裹生成器,不能直接返回生成器对象。
  • 媒体类型根据前端接收方式调整,SSE格式要求每个输出带data: 前缀和换行。

Flask 实现相同的流式输出功能

完全可以,Flask实现流式输出的逻辑和FastAPI类似,用Response对象包裹生成器即可。

示例代码:

from flask import Flask, request, Response
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

app = Flask(__name__)

# 初始化Llama-Index索引
documents = SimpleDirectoryReader("your_data_folder").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(streaming=True)

def stream_response(query):
    response = query_engine.query(query)
    for token in response.response_gen:
        yield token
        # SSE格式用这个:yield f"data: {token}\n\n"

@app.route("/stream-qa")
def stream_qa():
    query = request.args.get("query")
    return Response(stream_response(query), content_type="text/event-stream")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

注意事项

  • Flask的Response直接接收生成器就能实现流式输出,无需额外配置。
  • 媒体类型设置逻辑和FastAPI一致,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:07:13