PandasAI 如何用 follow_up 在多轮对话中保持上下文
【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-ai
用pai.chat()问数据时,每次调用都是一次性的:它不会记得上一次问过什么。如果你想在回答之上继续追问——比如先问“总销售额是多少”,再问“那去年呢”——就需要使用 PandasAI 的Agent及其follow_up方法。follow_up与chat的区别在于:chat会开启新对话并清空会话记忆,而follow_up不清空记忆,agent 可以基于之前的问答理解上下文(Agent 文档)。本文给出从零配置到验证多轮对话上下文生效的完整路径。
准备条件
按 Installation & Quickstart,PandasAI 要求 Python3.8+ <=3.11。多轮对话本身还需要一个可用的 LLM,v3 中必须全局配置 LLM(迁移文档)。
# 安装主包(pip 或 poetry 均可) pip install pandasai # 以 OpenAI 为例,安装 LLM 扩展 pip install pandasai-litellm全局配置 LLM(下面的 API key 和模型名需要你按自己账号替换,文档示例使用的是gpt-4.1-mini):
import pandasai as pai from pandasai_litellm.litellm import LiteLLM llm = LiteLLM(model="gpt-4.1-mini", api_key="YOUR_OPENAI_API_KEY") pai.config.set({ "llm": llm })如果没配 LLM 就调用chat,会抛出ValueError,提示 API key 未包含 LLM 额度,需要配置 OpenAI 或 LiteLLM key。
创建 Agent 并用 chat 开启对话
pai.chat()面向单会话的探索式分析;多轮对话需要实例化Agent。以 Agent 文档 中的示例数据为例:
import pandas as pd from pandasai import Agent # 示例 DataFrame sales_by_country = pd.DataFrame({ "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"], "sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000], "deals_opened": [142, 80, 70, 90, 60, 50, 40, 30, 110, 120], "deals_closed": [120, 70, 60, 80, 50, 40, 30, 20, 100, 110] }) agent = Agent(sales_by_country) agent.chat('Which are the top 5 countries by sales?') # 文档示例输出: China, United States, Japan, Germany, Australia注意chat的语义:在 Agent 源码 中,chat会先调用start_new_conversation()(即清空记忆)再处理查询。所以每次调chat都是重新开始一轮对话,而follow_up才会接着上一轮说。
用 follow_up 保持上下文
开始新一轮对话用chat,之后所有延续性追问都用follow_up,两者都接受query和可选的output_type参数(源码):
# Start a new conversation response = agent.chat('What is the total sales?') print("First response:", response) # Continue the conversation without clearing memory follow_up_response = agent.follow_up('What about last year?') print("Follow-up response:", follow_up_response)文档对这一行为的说明是:follow_up方法与chat工作方式相同,但不清空会话记忆,agent 因此能理解来自之前消息的上下文。
响应对象打印时会自动输出其.value属性(见 Chat and Output),所以print(response)即可看到回答内容。追问是否真的“记得”上文,最直接的核对方式是检查追问回答是否引用了前一轮的对象(例如继续按国家、销售额口径回答,而不是把“What about last year?”当成一个没有参照的孤立问题来报错或泛泛回答)。同时可以用response.last_code_executed查看生成本次回答的执行代码,辅助判断追问是否落在正确的字段和口径上。
模块级入口:pai.follow_up
除了在 agent 实例上调follow_up,PandasAI 还提供了模块级pai.follow_up(query)(入口实现)。它与pai.chat(query, *dataframes)配对使用:pai.chat会创建并保存一个全局 agent,pai.follow_up继续这个 agent 的对话。
这里有一个明确的报错场景:如果还没有通过pai.chat建立过对话就调用pai.follow_up,会抛出ValueError,错误信息为"No existing conversation. Please use chat() to start a new conversation."。也就是说模块级follow_up的前置条件是先执行过一次pai.chat。
控制与重置对话记忆
Agent构造时接受memory_size参数,默认值为10(Agent 源码),用于限制带入下一轮提示的历史消息条数(Memory 实现)。官方文档示例中的写法:
agent = Agent([df1, df2], memory_size=10)当需要丢弃历史、从零开始时,文档给出的路径是再次调用chat——因为chat自带清空记忆的行为;也可以显式调用agent.start_new_conversation()或agent.clear_memory()达到同样效果(源码)。
v2 用户迁移时注意
如果你是从 v2 迁移过来,follow_up是 v3 新增的 Agent 方法(Backwards Compatibility 文档):
# Start conversation response = agent.chat('What is the total revenue?') # Follow up without losing context follow_up = agent.follow_up('What about last quarter?')同一文档同时提醒:v2 中的clarification_questions()、explain()和rephrase_query()方法在 v3 中已被移除(迁移排查文档)。遇到AttributeError: 'Agent' object has no attribute 'clarification_questions'这类报错时,替代方式就是改用chat开启对话、follow_up延续上下文。
小结与边界
- 单会话探索用
pai.chat()/df.chat();多轮追问用Agent+follow_up(或模块级pai.chat+pai.follow_up)。 chat每次调用都会清空记忆;follow_up不清空,这是两者唯一的实质区别。- 模块级
pai.follow_up之前必须先有pai.chat,否则抛出ValueError: No existing conversation...。 memory_size控制带入上下文的历史消息量,默认 10。- v3 要求全局配置 LLM(
pai.config.set),否则chat/follow_up都会因缺少 LLM 报错。
完整的 agent 用法(含沙箱执行、向量库训练)可继续参考 Agent 文档,输出格式细节见 Chat and Output。
【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考