SQL
本示例演示了使用SQLDatabaseChain
在SQL数据库上进行问题回答的用法。
本示例使用了Chinook数据库,这是一个可用于SQL Server、Oracle、MySQL等数据库的示例数据库。
设置
首先安装typeorm
:
npm install typeorm
然后安装所需的数据库依赖项。例如,对于SQLite:
npm install sqlite3
其他数据库的安装请参考https://typeorm.io/#installation。目前,LangChain.js默认支持Postgres、SQLite、Microsoft SQL Server、MySQL和SAP HANA。
最后,请按照https://database.guide/2-sample-databases-sqlite/上的说明获取使用该示例的样本数据库。
import { DataSource } from "typeorm";
import { OpenAI } from "langchain/llms/openai";
import { SqlDatabase } from "langchain/sql_db";
import { SqlDatabaseChain } from "langchain/chains/sql_db";
/**
* 本示例使用了Chinook数据库,这是一个可用于SQL Server、Oracle、MySQL等数据库的示例数据库。
* 要设置它,请按照<https://database.guide/2-sample-databases-sqlite/>上的说明进行操作,
* 并将.db文件放在示例文件夹中。
*/
const datasource = new DataSource({
type: "sqlite",
database: "Chinook.db",
});
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
});
const chain = new SqlDatabaseChain({
llm: new OpenAI({ temperature: 0 }),
database: db,
});
const res = await chain.run("有多少个音轨?");
console.log(res);
// 有3503个音轨。
您可以在创建SqlDatabase
对象时包含或排除表格,以帮助链条专注于您想要的表格。这也可以减少链条中使用的标记数量。
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
includesTables: ["Track"],
});
如果需要,您可以在调用链时返回使用的SQL命令。
import { DataSource } from "typeorm";
import { OpenAI } from "langchain/llms/openai";
import { SqlDatabase } from "langchain/sql_db";
import { SqlDatabaseChain } from "langchain/chains/sql_db";
/**
* 本示例使用了Chinook数据库,这是一个可用于SQL Server、Oracle、MySQL等数据库的示例数据库。
* 要设置它,请按照<https://database.guide/2-sample-databases-sqlite/>上的说明进行操作,
* 并将.db文件放在示例文件夹中。
*/
const datasource = new DataSource({
type: "sqlite",
database: "Chinook.db",
});
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
});
const chain = new SqlDatabaseChain({
llm: new OpenAI({ temperature: 0 }),
database: db,
sqlOutputKey: "sql",
});
const res = await chain.call({ query: "有多少个音轨?" });
/* 预期结果:
* {
* result: '有3503个音轨。',
* sql: 'SELECT COUNT(*) FROM "Track";'
* }
*/
console.log(res);
SAP Hana
下面是使用SAP HANA数据库的示例:
import { DataSource } from "typeorm";
import { OpenAI } from "langchain/llms/openai";
import { SqlDatabase } from "langchain/sql_db";
import { SqlDatabaseChain } from "langchain/chains/sql_db";
/**
* 此示例使用SAP HANA云数据库。您可以通过https://developers.sap.com/tutorials/hana-cloud-deploying.html创建一个免费试用数据库
*
* 在使用typeorm与SAP HANA时,需要在package.json中添加以下软件包:
*
* "hdb-pool": "^0.1.6", (或最新版本)
* "@sap/hana-client": "^2.17.22" (或最新版本)
*
*/
const datasource = new DataSource({
type: "sap",
host: ".hanacloud.ondemand.com",
port: 443,
username: "",
password: "",
schema: "",
encrypt: true,
extra: {
sslValidateCertificate: false,
},
});
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
});
const chain = new SqlDatabaseChain({
llm: new OpenAI({ temperature: 0 }),
database: db,
});
const res = await chain.run("有多少个音轨?");
console.log(res);
// 音轨数为3503。
自定义提示
您还可以自定义提示的内容。下面是一个示例,将模型了解到“foobar”与“Employee”表相同:
import { DataSource } from "typeorm";
import { OpenAI } from "langchain/llms/openai";
import { SqlDatabase } from "langchain/sql_db";
import { SqlDatabaseChain } from "langchain/chains/sql_db";
import { PromptTemplate } from "langchain/prompts";
const template = \`给定一个输入问题,首先创建一个语法上正确的{dialect}查询,然后查看查询的结果并返回答案。
使用以下格式:
问题: "问题在这里"
SQL查询: "要运行的SQL查询"
SQL结果: "SQL查询的结果"
答案: "最终答案在这里"
只能使用以下表:
{table_info}
如果有人提到表foobar,实际指的是employee表。
问题: {input}\`;
const prompt = PromptTemplate.fromTemplate(template);
/**
* 此示例使用Chinook数据库,该数据库是为SQL Server,Oracle,MySQL等提供的示例数据库。
* 要设置它,请根据https://database.guide/2-sample-databases-sqlite/上的说明操作,将.db文件放在示例文件夹中。
*/
const datasource = new DataSource({
type: "sqlite",
database: "data/Chinook.db",
});
const db = await SqlDatabase.fromDataSourceParams({
appDataSource: datasource,
});
const chain = new SqlDatabaseChain({
llm: new OpenAI({ temperature: 0 }),
database: db,
sqlOutputKey: "sql",
prompt,
});
const res = await chain.call({
query: "foobar表中有多少名员工?",
});
console.log(res);
/*
{
result: 'foobar表中有8名员工。',
sql: 'SELECT COUNT(*) FROM Employee;'
}
*/