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

如何将LLM API返回的生成器对象转换为指定结构的DataFrame

如何将LLM API返回的生成器对象转换为指定结构的DataFrame

你好!从你的代码和描述来看,核心问题是你现在只收集了流式返回的片段文本,还没有把它们拼接成完整的响应内容;另外要转成DataFrame,最可靠的方式是让LLM返回结构化格式(比如CSV/JSON),避免解析纯文本表格的麻烦。下面分步骤帮你解决:

第一步:拼接完整的响应文本

流式返回的stream生成器每次输出的是一小段内容(delta.content),而且有时候可能是空值(比如开头或结尾的chunk),所以首先要把这些有效片段拼接成完整的字符串:

import pandas as pd
from io import StringIO

# 你的原有流式请求代码
stream = client.chat.completions.create(
    model="meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo",
    messages=msg,
    temperature=0.4,
    top_p=0.7,
    top_k=50,
    repetition_penalty=1,
    stop=["<|eot_id|>","<|eom_id|>"], 
    stream=True
)

# 收集并拼接完整响应
full_response = ""
for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:  # 只处理非空的内容片段
        full_response += content
        print(content, end="", flush=True)

第二步:让LLM返回结构化格式(关键!)

要顺利转换成DataFrame,最稳妥的方式是在你的prompt里明确要求LLM返回结构化输出,比如CSV或者JSON格式,避免解析纯文本表格的不确定性。

比如在你的msg最后加上一段提示:

请将结果以严格的CSV格式返回,列名必须为:Sno,Name,Parentname,Hno,age,gender,Enrollment,不要添加任何额外的解释性文字、标题或备注。

或者要求JSON格式:

请将结果以严格的JSON数组格式返回,每个元素包含以下字段:Sno, Name, Parentname, Hno, age, gender, Enrollment,不要添加任何其他内容。

第三步:解析结构化文本为DataFrame

根据你要求的格式,选择对应的解析方式:

情况1:LLM返回CSV格式

# 直接用pandas读取拼接后的CSV文本
df = pd.read_csv(StringIO(full_response))

情况2:LLM返回JSON格式

import json
# 解析JSON字符串为列表,再转成DataFrame
data_list = json.loads(full_response)
df = pd.DataFrame(data_list)

情况3:如果LLM返回的是纯文本表格(比如空格/制表符分隔)

如果没办法让LLM返回结构化格式,只能处理纯文本的话,可以按行分割后提取数据:

# 分割文本为行,过滤空行
lines = [line.strip() for line in full_response.split('\n') if line.strip()]
# 提取表头(第一行),假设是逗号分隔,可根据实际调整分隔符
headers = [col.strip() for col in lines[0].split(',')]
# 提取数据行
data_rows = []
for line in lines[1:]:
    row = [item.strip() for item in line.split(',')]
    data_rows.append(row)
# 构建DataFrame
df = pd.DataFrame(data_rows, columns=headers)

常见问题排查

  • 为什么之前存到列表里是字符片段?因为流式返回的每个chunk只返回一小部分内容,必须拼接起来才是完整的响应,你之前的ls_text只是存了每个片段,没有合并成完整文本。
  • 如果LLM返回的内容有多余的文字(比如开头的“好的,以下是结果:”),可以先清理文本,比如用正则提取表格部分:
    import re
    # 匹配从表头开始到表格结束的内容
    table_pattern = re.compile(r'Sno,Name,Parentname,Hno,age,gender,Enrollment\n.*', re.DOTALL)
    table_text = table_pattern.search(full_response).group()
    df = pd.read_csv(StringIO(table_text))
    

备注:内容来源于stack exchange,提问作者Sekar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:58:05