用大型语言模型实现CSV文件的智能问答

138 阅读2分钟

引言

随着大型语言模型(LLMs)在自然语言处理任务上的出色表现,越来越多的开发者开始尝试将其应用于问答系统中。CSV文件作为常见的数据存储格式,为开发这些系统提供了丰富的数据源。本篇文章将为您详细介绍如何使用LLMs在CSV文件上构建问答系统的两种方法:将CSV数据导入SQL数据库,和在Python环境中通过Pandas库进行操作。

主要内容

方法一:导入CSV文件到SQL数据库

将CSV文件导入SQL数据库是我们推荐的方法,因为这种方法可以更好地控制权限和查询的安全性。大多数数据库系统(例如DuckDB,SQLite)都支持将CSV文件导入为表格。在本文中,我们以SQLite为例:

from langchain_community.utilities import SQLDatabase
from sqlalchemy import create_engine
import pandas as pd

# 读取CSV文件
df = pd.read_csv("titanic.csv")
print(df.shape)  # (887, 8)

# 创建SQLite数据库并导入数据
engine = create_engine("sqlite:///titanic.db")
df.to_sql("titanic", engine, index=False)

# 创建数据库实例并执行查询
db = SQLDatabase(engine=engine)
print(db.run("SELECT * FROM titanic WHERE Age < 2;"))

方法二:使用Pandas库进行数据操作

使用Pandas库和LLMs的代码生成能力,我们可以直接在Python环境中与CSV数据进行交互。尽管这种方法灵活性高,但需注意在生产环境中实施安全保障措施。

import pandas as pd
from langchain_experimental.tools import PythonAstREPLTool

# 读取CSV文件
df = pd.read_csv("titanic.csv")

# 创建数据分析工具
tool = PythonAstREPLTool(locals={"df": df})
tool.invoke("df['Fare'].mean()")

代码示例

下面是如何使用SQL方法来计算泰坦尼克号幸存者的平均年龄:

# 使用API代理服务提高访问稳定性
from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits import create_sql_agent

llm = ChatOpenAI(model="gpt-4o-mini")
db = SQLDatabase(engine=engine)

# 创建SQL代理并执行查询
agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
result = agent_executor.invoke({"input": "what's the average age of survivors"})
print(result['output'])  # 输出幸存者的平均年龄

常见问题和解决方案

  • 安全性问题:在执行SQL或Python代码时,确保对输入进行严格的校验和权限管理。
  • 网络访问限制:某些地区的开发者可能需要通过API代理服务来稳定访问外部API。

总结和进一步学习资源

本文介绍了在CSV文件上实现智能问答系统的两种方法。通过SQL数据库的方式,您可以利用数据库的权限管理机制进一步提高安全性。使用Pandas库则提供了灵活性来处理复杂的数据查询。

进一步学习资源

参考资料

  • LangChain API参考
  • Pandas库文档
  • SQLAlchemy库文档

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

---END---