微信扫码
与创始人交个朋友
我要投稿
基于Llama 3和LangChain,使用自然语言进行SQL查询。
在数据泛滥的今天,如何高效地从海量信息中提取有价值的洞察,已成为开发者面临的共同挑战。本文介绍一个创新项目——基于Streamlit的应用程序,它能够理解自然语言并直接与SQL数据库进行交互,从而简化数据分析流程。
在本项目中,我们选择PostgreSQL作为后端数据库。用户需自行安装并配置PostgreSQL,同时需要搭建Ollama环境以及OpenWebUI界面。具体的安装和配置步骤,建议参考相应的官方文档或社区指南进行操作。
接着是创建自定义LLM,根据用户输入生成SQL查询。这里会使用OpenWebUI完成这项任务。以下是设置方法:
创建新模型文件:
模型内容定义:
保存模型:
LangChain是开源的框架,用于构建基于大型语言模型的应用程序。它通过将语言模型与内部数据源相结合,自动化地串联起一系列操作,生成智能响应。
利用LangChain,我们能够实现数据库与自然语言之间的无缝交互。这一解决方案的实现,是通过在Python的app.py
文件中编写代码来完成的。
首先,确保环境已安装以下包:
将数据库凭据保存在本地变量中,并创建一个使用LangChain的SQLDatabase包装器建立连接的函数。
pwd = os.environ['PGPASS']
uid = os.environ['PGUID']
server = "localhost"
db = "adventureworks"
port = 5432
def init_database() -> SQLDatabase:
db_uri = f"postgresql://{uid}:{pwd}@{server}:{port}/{db}"
return SQLDatabase.from_uri(db_uri, schema="sales")
创建自定义函数,根据用户输入生成SQL。这个函数使用Ollama访问自定义模型。
def llm_query(question):
# 第一个sql llm
llm = ChatOllama(model="llama-sql")
prompt = ChatPromptTemplate.from_template(" {topic}")
# 链
chain = prompt | llm | StrOutputParser()
# 链调用
sql = chain.invoke({"topic": f"{question}"})
sql = re.sub(r'(?:(?<=_) | (?=_))','',sql)
# 返回sql查询
return sql
开发一个功能强大的函数,它能够实现与数据库的自然语言交互。该函数能够接收用户的查询、数据库的连接信息以及之前的聊天记录,从而为用户提供一个连贯且上下文相关的交互体验。
def get_response(user_query: str, db: SQLDatabase, chat_history: list):
sql_query = llm_query(user_query)
template = """
您是公司中经验丰富的数据分析师。您正在与询问公司数据库问题的用户进行交互。
根据表架构、问题、SQL查询和SQL响应,用自然语言编写回答。
对话历史:{chat_history}
用户问题:{question}
SQL响应:{response}
"""
prompt = ChatPromptTemplate.from_template(template)
# llm
llm = ChatOllama(model="llama3", temperature=0)
chain = (
RunnablePassthrough.assign(
response=lambda vars: db.run(sql_query),
)
| prompt
| llm
| StrOutputParser()
)
return chain.invoke({
"question": user_query,
"chat_history": chat_history,
})
创建Streamlit组件以存储聊天历史和管理用户交互。
初始化数据库:
# 初始化数据库
db = init_database()
st.session_state.db = db
st.success("已连接到数据库!")
处理用户输入:
user_query = st.chat_input("输入一个问题...")
if user_query is not None and user_query.strip() != "":
st.session_state.chat_history.append(HumanMessage(content=user_query))
with st.chat_message("用户"):
st.markdown(user_query)
with st.chat_message("AI"):
response = get_response(user_query, st.session_state.db, st.session_state.chat_history)
st.markdown(response)
用几个查询来测试应用程序,以确保其能正常运行。
1)总销售额:
2)销售额Top 10
3)按国家/地区销售情况:
LangChain和LLM的这种集成为数据分析打开了无数可能性,特别是对于特定的架构。用户现在可以使用自然语言获取答案,从而增强和补充现有的商业智能解决方案。
本书介绍自然语言处理的原理和方法及其代码实现,是一本着眼于自然语言处理教学实践的图书。 本书分为3个部分。第一部分介绍基础技术,包括文本规范化、文本表示、文本分类、文本聚类。第二部分介绍自然语言的序列建模,包括语言模型、序列到序列模型、预训练语言模型、序列标注。第三部分介绍自然语言的结构建模,包括成分句法分析、依存句法分析、语义分析、篇章分析。本书将自然语言处理的理论与实践相结合,提供所介绍方法的代码示例,能够帮助读者掌握理论知识并进行动手实践。 本书适合作为高校自然语言处理课程的教材,也可作为相关行业的研究人员和开发人员的参考资料。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-06-20
2024-07-03
2024-06-14
2024-06-06
2024-06-14
2024-06-21
2024-06-16
2024-06-07
2024-07-21
2024-07-01
2024-11-19
2024-11-06
2024-10-25
2024-10-25
2024-10-25
2024-10-18
2024-10-09
2024-10-07