一架梯子,一头程序猿,仰望星空!
LangChain教程(JS版本) > 内容正文

自然语言转SQL任务


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;'
  }
*/


关联主题