框架与工具链2187 字
LangChain基于SQL实现数据分析问答
·全库 343 / 611
《LangChain基于SQL实现数据分析问答》共 0.2 万字,通篇围绕 数据库、检索、向量、prompt 展开,归在「框架与工具链」这一层。
覆盖数据库检索向量promptLangChain微调
适合要选技术栈、不想把别人踩过的坑重踩一遍的人
目录骨架(1 节)
- 问答效果
示例代码
注:将ppt后缀名改为zip后解压
python版本:3.12.4
需求
基于 LangChain 和 Streamlit 的 Web 应用,用于使用 LLM 和嵌入从 SQLite 数据库中搜索相关的offer。用户可以输入与品牌、类别或零售商相关的搜索查询,也支持通过SQL语句进行搜索,应用程序将从数据库中检索并显示相关的offer。该应用使用 OpenAI API 进行自然语言处理和嵌入生成。
SQLite 官网:https://www.sqlite.org/pragma.html#toc
SQLite 使用手册:https://www.runoob.com/sqlite/sqlite-select.html
方法
- 目标:该方法的目标是基于产品类别、品牌或零售商查询从 offer_retailer 表中提取相关的offer。鉴于所需数据分散在 data 目录中的多个表中,采用了语言模型(LLM)来促进智能数据库查询。
- 数据库准备:最初,使用存储在 data 目录中的 .csv 文件构建了一个本地 SQLite 数据库。这是通过 sqlite3 和 pandas 库实现的。
- LLM 集成:通过 langchain_experimental.sql.SQLDatabaseChain 实现了语言模型(LLM)与本地 SQLite 数据库的有效交互。
- 提示工程:该方法的一个重要方面是制定合适的提示,以指导 LLM 最佳地检索和格式化数据库条目。通过多次迭代和实验来微调这个提示。
- 相似度评分:为了确定检索结果与查询的相关性,进行了余弦相似度比较。使用 langchain_openai.OpenAIEmbeddings 生成嵌入进行比较,从而对结果进行排序。
- Streamlit 集成:最后一步是解析 LLM 的输出,并围绕它构建一个用户友好的 Streamlit 应用,允许用户进行交互式搜索。
环境
在开始之前,请确保满足以下要求:
- Python 3.12.4 或更高版本
- OpenAI API 密钥
- 包含以下表的 SQLite 数据库:brand_category,categories 和 offer_retailer
安装所需的包:
pip install -r requirements.txt
确保您的 SQLite 数据库已设置好,并包含必要的表(brand_category,categories,offer_retailer)。
注意:streamlit版本需要<1.30,一般为1.29.0,否则启动会报以下错误

代码
#示例:csv_search.py
import os
# 导入正则表达式模块
import re
import sqlite3
import pandas as pd
import streamlit as st
from llm import RetrievalLLM
# 数据文件路径
DATA_PATH = 'data'
# 数据表名称
TABLES = ('brand_category', 'categories', 'offer_retailer')
# 数据库名称
DB_NAME = 'offer_db.sqlite'
# 提示模板
PROMPT_TEMPLATE = """
你会接收到一个查询,你的任务是从`offer_retailer`表中的`OFFER`字段检索相关offer。
查询可能是混合大小写的,所以也要搜索大写版本的查询。
重要的是,你可能需要使用数据库中其他表的信息,即:`brand_category`, `categories`, `offer_retailer`,来检索正确的offer。
不要虚构offer。如果在`offer_retailer`表中找不到offer,返回字符串:`NONE`。
如果你能从`offer_retailer`表中检索到offer,用分隔符`#`分隔每个offer。例如,输出应该是这样的:`offer1#offer2#offer3`。
如果SQLResult为空,返回`None`。不要生成任何offer。
这是查询:`{}`
"""
# Streamlit应用标题
st.title("搜索offer 🔍")
# 连接SQLite数据库
conn = sqlite3.connect('offer_db.sqlite')
# 判断是否是SQL查询的函数
def is_sql_query(query):
# 定义一个包含常见 SQL 关键字的列表
sql_keywords = [
'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'DROP', 'ALTER',
'TRUNCATE', 'MERGE', 'CALL', 'EXPLAIN', 'DESCRIBE', 'SHOW'
]
# 去掉查询字符串两端的空白字符并转换为大写
query_upper = query.strip().upper()