框架与工具链2187 字

LangChain基于SQL实现数据分析问答

·全库 343 / 611

《LangChain基于SQL实现数据分析问答》共 0.2 万字,通篇围绕 数据库、检索、向量、prompt 展开,归在「框架与工具链」这一层。

覆盖数据库检索向量promptLangChain微调

适合要选技术栈、不想把别人踩过的坑重踩一遍的人

目录骨架(1 节)
  1. 问答效果
目录 · 4 节

示例代码

注:将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,否则启动会报以下错误

image.png

​

代码

#示例: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()

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求