LangChain组件 – LLMChain
PromptTemplate 模板工具
Demo - 一个基于自然语言查询的工厂管理系统
# 导入需要的库
from langchain.chains import LLMChain # 语言模型链,用于处理对话流程
from langchain.prompts import PromptTemplate # 用于创建对话模板
from langchain.llms import OpenAI # OpenAI的语言模型
import mysql.connector # MySQL数据库连接库
from mysql.connector import Error # 错误处理
import os # 操作系统相关功能
# 数据库配置(类似填写快递单)
DB_CONFIG = {
'host': 'localhost', # 数据库地址(本机)
'user': 'factory_user', # 用户名(类似银行账号)
'password': 'factory_password', # 密码
'database': 'factory_db' # 要使用的数据库名(类似Excel文件名)
}
class FactoryAgent: # 定义一个工厂智能体类(就像造一个机器人)
def __init__(self): # 初始化方法(机器人开机时的准备工作)
self.llm = OpenAI(temperature=0) # 创建语言模型(温度0表示最严谨的回答)
self.db_connection = self._create_db_connection() # 连接数据库
self._init_db() # 初始化数据库(建表)
# 创建查询链(教机器人如何把中文转成SQL)
self.query_chain = LLMChain(
llm=self.llm, # 使用的语言模型
prompt=PromptTemplate(
input_variables=["query"], # 输入变量(用户的问题)
template="将以下中文工厂查询转换为SQL语句:\n{query}" # 转换模板
)
)
# 创建数据库连接方法(类似给机器人装网线)
def _create_db_connection(self):
try: # 尝试连接
connection = mysql.connector.connect(**DB_CONFIG) # **表示解包字典配置
return connection # 返回连接对象
except Error as e: # 如果出错
print(f"数据库连接错误: {e}") # 打印错误信息
return None # 返回空值
# 初始化数据库表(给机器人准备记事本)
def _init_db(self):
# 建表SQL语句列表(三个表格的创建命令)
create_tables = [
"""
CREATE TABLE IF NOT EXISTS equipment ( # 设备表(如果不存在就创建)
id INT AUTO_INCREMENT PRIMARY KEY, # 自动增长的ID(唯一编号)
name VARCHAR(255) NOT NULL, # 设备名称(不能为空)
status ENUM('运行中', '待机', '维修中') DEFAULT '待机', # 状态枚举
last_maintenance DATE # 最后维护日期
)
""",
# 生产记录表(类似生产日记本)
"""
CREATE TABLE IF NOT EXISTS production (
id INT AUTO_INCREMENT PRIMARY KEY,
equipment_id INT, # 关联设备ID
product_name VARCHAR(255), # 产品名称
quantity INT, # 生产数量
production_time DATETIME, # 生产时间
FOREIGN KEY (equipment_id) REFERENCES equipment(id) # 外键约束
)
""",
# 库存表(仓库物品清单)
"""
CREATE TABLE IF NOT EXISTS inventory (
id INT AUTO_INCREMENT PRIMARY KEY,
material_name VARCHAR(255) NOT NULL, # 材料名称
quantity INT DEFAULT 0, # 数量(默认为0)
location VARCHAR(255) # 存放位置
)
""" # 注意这里修正了原代码缺少的右括号
]
cursor = self.db_connection.cursor() # 创建游标(类似拿笔写字)
for table in create_tables: # 遍历所有建表语句
cursor.execute(table) # 执行SQL语句
self.db_connection.commit() # 提交更改(类似保存文件)
cursor.close() # 关闭游标(放下笔)
# 执行查询方法(机器人的工作流程)
def execute_query(self, user_query):
try:
# 第一步:让语言模型生成SQL(把中文翻译成数据库能懂的语言)
generated_sql = self.query_chain.run(user_query)
print(f"生成的SQL: {generated_sql}") # 打印生成的SQL(调试用)
# 第二步:执行SQL查询
cursor = self.db_connection.cursor(dictionary=True) # 创建字典格式游标
cursor.execute(generated_sql) # 执行SQL语句
# 判断是否是查询语句(SELECT)
if "SELECT" in generated_sql.upper():
result = cursor.fetchall() # 获取所有结果
else: # 如果是更新/插入操作
self.db_connection.commit() # 提交更改
result = "操作执行成功"
cursor.close() # 关闭游标
return result # 返回结果
except Error as e:
return f"数据库错误: {e}" # 捕获数据库错误
except Exception as e:
return f"处理错误: {e}" # 捕获其他错误
# 添加示例数据方法(给机器人一些练习数据)
def add_sample_data(self):
try:
cursor = self.db_connection.cursor()
# 插入设备数据(两条记录)
cursor.execute("""
INSERT INTO equipment (name, status, last_maintenance)
VALUES
('注塑机-01', '运行中', '2023-08-01'), # 值1
('冲压机-02', '待机', '2023-07-25') # 值2
""")
# 插入生产记录(两条记录)
cursor.execute("""
INSERT INTO production (equipment_id, product_name, quantity, production_time)
VALUES
(1, '塑料外壳', 1000, NOW()), # 设备1的生产记录
(1, '塑料配件', 800, NOW()) # 设备1的另一条记录
""")
# 插入库存数据
cursor.execute("""
INSERT INTO inventory (material_name, quantity, location)
VALUES
('ABS塑料颗粒', 5000, 'A区-3排'), # 材料1
('钢板', 2000, 'B区-1排') # 材料2
""")
self.db_connection.commit() # 提交所有插入操作
cursor.close()
return "示例数据添加成功"
except Error as e:
return f"添加示例数据失败: {e}"
# 使用示例(机器人开机后的操作)
if __name__ == "__main__":
agent = FactoryAgent() # 创建智能体实例(启动机器人)
print(agent.add_sample_data()) # 添加示例数据
# 准备四个测试问题
queries = [
"查询当前所有设备的状态", # 问题1
"统计注塑机-01最近的生产总量", # 问题2
"查询ABS塑料颗粒的库存位置和数量", # 问题3
"将冲压机-02的状态改为维修中" # 问题4
]
# 遍历执行每个查询
for query in queries:
print(f"\n查询: {query}") # 打印当前问题
result = agent.execute_query(query) # 执行查询
print("结果:", result) # 显示结果