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

如何为LLM长链GPT Agent创建带预定义列的CSV分析函数工具

如何为GPT Agent定义CSV文件的结构与列定义工具

背景

我要创建一个GPT Agent,它需要从3个预定义CSV文件中获取数据,因此得为每个CSV文件创建对应的函数工具。

核心需求

这个GPT Agent必须清楚每个CSV的用途、包含的列以及各列能提供的数据细节——在工具定义里明确CSV结构和列信息,能大幅提升LLM生成结果的效率和准确性。

当前问题

我不确定该如何正确定义CSV的结构与列定义,下面是我尝试写的代码:

csv1_inspection_tool = StructuredTool.from_function(
    func=get_first_n_rows,
    name="InspectCSVFile",
    description="Explore the contents and structure of a table document, displaying its column names and the first n rows, with n defaulting to 3.",
)
import pandas as pd

def get_csv_filename(
        filename: str
    ) -> str:
    """Get CSV file name"""
    # Read the CSV file
    csv_file = pd.read_csv(filename)
    
    # Since there's no sheet name, we just return the filename
    return f"The file name of the CSV is '{filename}'"


def get_column_names(filename: str) -> str:
    """Get all column names from a CSV file"""

    df = pd.read_csv(filename)
    column_names = '\n'.join(df.columns.to_list())
    result = f"The File '{filename}' has columns:\n\n{column_names}"
    return result


def get_first_n_rows(
        filename: str,
        n: int = 3
) -> str:
    """Get CSV File First N Lines"""
    result = get_csv_filename(filename) + "\n\n"
    result += get_column_names(filename) + "\n\n"

    df = pd.read_csv(filename)  
    n_lines = '\n'.join(
        df.head(n).to_string(index=False, header=True).split('\n')
    )
    result += f"This file '{filename}' has first {n} lines of sample:\n\n{n_lines}"
    return result

优化方案

1. 为每个预定义CSV创建专属工具

既然是固定的3个CSV,没必要用通用工具,直接为每个CSV创建专属工具,在描述里明确其业务用途、核心列的含义,让Agent一眼就能区分:

from langchain.tools import StructuredTool

# 假设3个CSV分别是用户数据、订单数据、产品数据
# 用户数据CSV工具
user_csv_tool = StructuredTool.from_function(
    func=lambda n=3: get_first_n_rows("user_data.csv", n),
    name="InspectUserCSV",
    description="用于查看用户数据CSV文件,该文件存储平台注册用户的基础信息,包含列:user_id(用户唯一ID)、username(用户名)、email(邮箱)、register_date(注册日期)、age(年龄)。工具会返回文件名、所有列名及前n行数据,n默认值为3。"
)

# 订单数据CSV工具
order_csv_tool = StructuredTool.from_function(
    func=lambda n=3: get_first_n_rows("order_data.csv", n),
    name="InspectOrderCSV",
    description="用于查看订单数据CSV文件,该文件存储用户的订单交易信息,包含列:order_id(订单唯一ID)、user_id(关联用户ID)、product_id(关联产品ID)、order_date(下单日期)、total_amount(订单总金额)、status(订单状态)。工具会返回文件名、所有列名及前n行数据,n默认值为3。"
)

# 产品数据CSV工具
product_csv_tool = StructuredTool.from_function(
    func=lambda n=3: get_first_n_rows("product_data.csv", n),
    name="InspectProductCSV",
    description="用于查看产品数据CSV文件,该文件存储平台在售产品的信息,包含列:product_id(产品唯一ID)、product_name(产品名称)、category(产品分类)、price(单价)、stock(库存数量)。工具会返回文件名、所有列名及前n行数据,n默认值为3。"
)

2. 增强函数的信息返回能力

现有函数只返回列名和样本行,还可以补充列的数据类型、空值情况、示例值含义,让Agent更清楚数据细节:

import pandas as pd

def get_csv_full_info(filename: str, n: int = 3) -> str:
    """获取CSV文件的完整结构与数据细节"""
    df = pd.read_csv(filename)
    
    # 基础文件信息
    info = f"文件名:{filename}\n"
    info += f"总行数:{len(df)},总列数:{len(df.columns)}\n\n"
    
    # 列详细信息
    info += "列详细信息:\n"
    for col in df.columns:
        dtype = str(df[col].dtype)
        non_null_count = df[col].notna().sum()
        null_count = df[col].isna().sum()
        sample_values = df[col].dropna().unique()[:3] if non_null_count >0 else ["无有效数据"]
        info += f"- 列名:{col}\n"
        info += f"  数据类型:{dtype}\n"
        info += f"  非空行数:{non_null_count},空值行数:{null_count}\n"
        info += f"  示例值:{', '.join(map(str, sample_values))}\n\n"
    
    # 前n行样本
    info += f"前{n}行样本数据:\n"
    info += df.head(n).to_string(index=False)
    return info

更新工具使用这个增强后的函数:

user_csv_tool = StructuredTool.from_function(
    func=lambda n=3: get_csv_full_info("user_data.csv", n),
    name="InspectUserCSV",
    description="用于查看用户数据CSV文件的完整结构与数据细节,该文件存储平台注册用户的基础信息。工具会返回文件基本信息、各列的数据类型/空值情况/示例值,以及前n行样本数据,n默认值为3。"
)

3. 优化函数的重复读取问题

现有代码里get_first_n_rows会重复调用pd.read_csv三次,可优化为只读取一次,提升效率:

def get_first_n_rows(
        filename: str,
        n: int = 3
) -> str:
    """Get CSV File First N Lines"""
    df = pd.read_csv(filename)
    
    result = f"The file name of the CSV is '{filename}'\n\n"
    result += f"The File '{filename}' has columns:\n\n" + '\n'.join(df.columns.to_list()) + "\n\n"
    
    n_lines = '\n'.join(
        df.head(n).to_string(index=False, header=True).split('\n')
    )
    result += f"This file '{filename}' has first {n} lines of sample:\n\n{n_lines}"
    return result

总结

通过为每个预定义CSV创建专属工具并明确其业务用途、增强函数返回的列细节信息、优化代码性能,就能让GPT Agent精准理解每个CSV的结构与数据含义,从而更高效准确地完成数据获取任务。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:50:00