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

