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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:14:52