如何让LangChain Pandas DataFrame Agent支持相似词而非精确词查询?
解决LangChain Pandas Agent模糊查询失效的方案
问题核心
默认的create_pandas_dataframe_agent会引导LLM生成精确匹配的代码(比如==判断),但用户的自然语言提问通常是模糊表述,导致无法匹配数据集中的内容。以下是几种实用的解决方法:
方案1:自定义提示词引导模糊匹配
直接修改Agent的提示词,明确告知LLM在处理关键词相关查询时,使用字符串包含而非精确匹配的逻辑。
from langchain.prompts import PromptTemplate # 自定义提示词,明确要求模糊匹配逻辑 custom_prompt = PromptTemplate( input_variables=["df", "input", "agent_scratchpad"], template=""" 你需要基于给定的Pandas DataFrame回答用户的活动查询问题。 当用户询问是否存在与某个关键词相关的活动(比如直升机游览、飞行体验等),请**务必使用字符串包含的方式查询**,不要用精确等于判断。 例如,检查活动名称列是否包含关键词时,使用:df['活动名称列'].str.contains('关键词', case=False, na=False) 注意忽略大小写,同时处理空值。 给定的DataFrame信息: {df} 用户的问题:{input} 请结合以下思考记录和工具完成回答: {agent_scratchpad} """ ) # 创建Agent时传入自定义提示词 agent = create_pandas_dataframe_agent( local_llm, df, verbose=True, prompt=custom_prompt ) # 测试模糊查询 res = agent.invoke("Is there any event related to helicopter tours?") print(res)
优势:无需修改数据集,仅通过提示词引导LLM生成正确的查询代码,实现成本低。
注意:需要确保本地LLM能理解提示词中的指令,复杂场景可能需要微调提示词。
方案2:预处理数据集,统一文本格式并提取关键词
通过预处理消除文本格式差异,同时提取核心关键词,降低LLM匹配难度。
# 假设第一列是活动名称,先统一转为小写 df['activity_name'] = df.iloc[:, 0].str.lower() # 提取核心关键词列,方便LLM定位 df['core_keywords'] = df['activity_name'].apply(lambda x: [word for word in x.split() if word not in ['tour', 'self-guided']]) # 重新创建Agent,此时LLM更容易通过关键词列进行模糊匹配 agent = create_pandas_dataframe_agent( local_llm, df, verbose=True )
优势:从数据层面统一格式,减少LLM的理解负担,匹配准确率更高。
适用场景:数据集文本格式不统一、关键词明确的场景。
方案3:结合向量检索缩小处理范围
先通过语义检索找到与用户提问相似的行,再将筛选后的小数据集交给Agent处理,避免LLM在全量数据中误判。
from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.schema import Document # 将DataFrame每行转为结构化文档 documents = [] for idx, row in df.iterrows(): doc_content = f"活动名称:{row[0]},类型:{row[1]},地址:{row[2]},主题:{row[3]},日期:{row[4]},开始时间:{row[5]},结束时间:{row[6]}" documents.append(Document(page_content=doc_content, metadata={"index": idx})) # 初始化向量存储(使用轻量开源模型) embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") vector_store = FAISS.from_documents(documents, embeddings) # 检索与用户提问相关的行 def get_relevant_data(query): similar_docs = vector_store.similarity_search(query, k=5) relevant_indices = [doc.metadata['index'] for doc in similar_docs] return df.loc[relevant_indices] # 先检索再交给Agent处理 user_query = "Is there any event related to helicopter tours?" relevant_df = get_relevant_data(user_query) agent = create_pandas_dataframe_agent(local_llm, relevant_df, verbose=True) res = agent.invoke(user_query) print(res)
优势:基于语义匹配,能处理更宽泛的自然语言提问,对本地LLM的推理能力要求更低。
注意:需要额外引入向量嵌入模型,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者texasdave
相关产品推荐
相关产品推荐

