如何在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
相关产品推荐
相关产品推荐

