你有一个能力超强但"不太懂行"的助手(大语言模型LLM)。它能说会道,知识渊博,但它:
- 不懂你的数据库: 不知道你的数据库里有哪些表,表里有哪些字段,这些字段代表什么意思。
- 不懂你的API: 不知道你的系统里有哪些可以调用的功能(API),这些功能需要什么参数(比如邮箱地址、城市名、日期)。
提示工程(Prompt Engineering) 就是教你如何给这个"超强助手"写一份清晰、详细的指令说明书(Prompt) ,让它能理解你的自然语言问题 ,并帮你完成特定的专业任务(写SQL查数据库、调用API)。
核心目标:把"人话"变成"机器能听懂的专业指令"
- Text2SQL: 把"今年卖得最好的产品是啥? " 变成
SELECT ... FROM ... WHERE ...
这样的数据库查询语句。 - Text2API: 把"给老王发个邮件,告诉他明天下午3点开会 " 变成调用
send_email
这个接口,并填好to=老王@公司.com
,subject=会议提醒
,content=明天下午3点开会...
这些参数。

python
from langchain.utilities import SQLDatabase
from langchain.chains import SQLDatabaseChain
from langchain_community.llms import OpenAI
db = SQLDatabase.from_uri("sqlite:///sales.db")
llm = OpenAI(temperature=0)chain = SQLDatabase
Chain.from_llm(llm, db, verbose=True)
response = chain.run("2024年销售额超过100万的产品是什么?")
sql
SELECT p.name, SUM(o.sales) AS total_sales
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE YEAR(o.date) = 2023
GROUP BY p.id
HAVING total_sales > 1000000;
关键秘诀:给助手"补课" (显式化领域知识)
LLM本身不懂你的业务细节。提示工程的核心就是通过Prompt把这些背景知识(领域知识) 明确地告诉它:
- 角色扮演: "嘿助手,你现在是一个数据库专家/API调用专家!"
- 知识注入:
- 对SQL: 把数据库的结构(Schema) 告诉它。比如:
- 我们有个
orders
表,里面有id, product_id, sales (销售额), date (日期)
- 还有个
products
表,里面有id, name (产品名), category (类别)
orders.product_id
对应着products.id
- 我们有个
- 对API: 把API文档 告诉它。比如:
- 有个API叫
/send_email
,需要用POST
方法调用,需要提供to (收件人邮箱), subject (邮件主题), content (邮件内容)
这三个参数。 - 还有个API叫
/weather
,需要用GET
方法调用,需要提供city (城市名), date (日期)
。
- 有个API叫
- 对SQL: 把数据库的结构(Schema) 告诉它。比如:

一、 Text2SQL 深入浅出解析 (怎么让助手帮你查数据库?)
- 助手需要什么?
- 你的问题: "2024年销售额超过100万的产品是什么?"
- 数据库结构: 哪些表?哪些字段?它们啥关系?(Schema)
- 助手怎么做? (提示工程的步骤)
-
理解问题: 助手先看你的问题,找出关键信息(这叫实体识别、关系抽取、意图理解 )。
- 你要查什么? -> 产品 (
product
) - 查哪个时间? -> 2024年 (
year=2024
) - 查什么条件? -> 销售额 (
sales
) 超过 (>
) 100万 (1000000
) - 怎么衡量? -> 很可能是按产品汇总 (
SUM(o.sales)
然后GROUP BY p.id
)
- 你要查什么? -> 产品 (
-
对照数据库结构 (Schema绑定): 助手拿着这些关键词,去对比你提供的Schema。
- "销售额" -> 哦,在
orders
表里叫sales
。 - "产品名" -> 在
products
表里叫name
。 orders
和products
怎么关联? -> 哦,通过orders.product_id = products.id
。- "2024年" ->
orders
表里有个date
字段,需要提取年份YEAR(o.date) = 2024
。
- "销售额" -> 哦,在
-
组装SQL语句: 助手根据理解的信息和数据库结构,拼装出正确的SQL语句。
sqlSELECT p.name, SUM(o.sales) AS total_sales -- 选出产品名,计算总销售额 FROM orders o -- 从订单表(起别名o) JOIN products p ON o.product_id = p.id -- 关联产品表(起别名p) WHERE YEAR(o.date) = 2024 -- 条件是2024年的订单 GROUP BY p.id -- 按产品分组 HAVING total_sales > 1000000; -- 筛选总销售额大于100万的产品
-
执行与反馈: 数据库运行这个SQL,把结果(产品列表)返回给你。如果SQL写错了(比如字段名不对),助手可能会尝试修正或者告诉你哪里出了问题(需要更好的Prompt或你提供更明确的信息)。
-
- LangChain 帮了大忙:
- 它有个
SQLDatabaseChain
能自动连接到你的数据库 (db = SQLDatabase.from_uri("sqlite:///sales.db")
)。 - 它能自动读取数据库结构(Schema)并塞进给LLM的Prompt里。
- 你只需要告诉LLM你的问题 (
chain.run("2024年销售额超过100万的产品是什么?")
),它就能帮你完成上述所有步骤(理解->绑定->生成->执行->返回结果)。
- 它有个
二、 Text2API 深入浅出解析 (怎么让助手帮你调用接口?)
Text2API(文本转API调用) 是一种将自然语言描述的用户需求自动转换为对应用程序接口(API)的调用请求的技术。

LangChain提供APIChain,支持将API文档(如OpenAPI/Swagger)嵌入提示词,引导大模型生成请求参数,可以支持多步骤调用(如先查询用户ID,再调用订单API)。
python
from langchain.chains import APIChain
from langchain_community.llms import OpenAI
llm = OpenAI(temperature=0)
api_docs = """
API文档:
- 发送邮件:POST /send_email
参数:to(收件人), subject(主题), content(内容)
- 查询天气:GET /weather
参数:city(城市), date(日期)
"""
chain = APIChain.from_llm_and_api_docs(llm, api_docs, verbose=True)
response = chain.run("给Allen发邮件,主题是会议提醒,内容为明天下午2点开会。")
如何实现Text2API?
通过自然语言处理技术进行语义解析(含意图识别、实体抽取、上下文理解),结合预加载的API文档信息,利用大语言模型(LLM)生成符合语法规范的API调用请求。
-
API目录管理:维护API文档(端点、参数、权限)。
例如:邮件API文档:POST /send_email 参数: to (str), subject (str), content (str) 权限: 需用户OAuth令牌
-
意图识别:模型解析用户指令,匹配目标API。
例如:"给Allen发邮件,主题是项目开发进度,内容为'本周完成80%'" → 调用 /send_email。
-
参数填充:提取并验证参数(如邮箱、内容)。
json{ "endpoint": "/send_email", "params": {"to": "[email protected]", "subject": "项目进度", "content": "本周完成80%" }
-
执行与反馈:调用API并返回结果(成功/失败原因)。

- 助手需要什么?
- 你的指令: "给Allen发邮件,主题是会议提醒,内容为明天下午2点开会。"
- API菜单: 系统里有哪些接口?每个接口怎么用?需要啥参数?(API文档)
- 助手怎么做? (提示工程的步骤)
- 管理API目录: 你需要事先准备好一份清晰的"服务菜单"(API文档),告诉助手:
- 有
/send_email
服务(POST
方法),需要to, subject, content
三个菜(参数)。 - 有
/weather
服务(GET
方法),需要city, date
两个菜(参数)。 - 可能还需要权限(比如登录令牌),但这篇文章例子没提。
- 有
- 理解你想点哪道菜 (意图识别): 助手看你的指令,找出你想做什么。
- "发邮件" -> 这对应
/send_email
这个API。
- "发邮件" -> 这对应
- 准备好配菜 (参数填充): 助手从你的指令里找出做这道菜需要的材料(参数)。
to
(收件人) 是谁? -> "Allen" -> 需要转成邮箱地址([email protected]
)。(实际应用中,可能需要查通讯录API,这里简化了)subject
(主题) 是什么? -> "会议提醒"。content
(内容) 是什么? -> "明天下午2点开会"。
- 下单并上菜 (执行与反馈): 助手按照API文档的要求(方法、参数格式),调用
/send_email
接口,把参数传过去。接口执行后,告诉助手结果:"邮件发送成功!" 或者 "失败,原因:收件人邮箱无效"。助手把这个结果告诉你。
- 管理API目录: 你需要事先准备好一份清晰的"服务菜单"(API文档),告诉助手:
- LangChain 帮了大忙:
- 它有个
APIChain
(chain = APIChain.from_llm_and_api_docs(llm, api_docs, verbose=True)
)。 - 你只需要把API文档 (
api_docs
) 提供给它,然后告诉它你的自然语言指令 (chain.run("给Allen发邮件...")
)。 - 它能自动帮你完成:理解指令对应哪个API -> 提取需要的参数 -> 组装API调用请求 -> 调用API -> 返回结果。它甚至能处理需要多个API按顺序调用的复杂任务(比如先查用户ID,再用ID查订单)。
- 它有个
总结:
- LLM (大模型): 一个超级聪明但没学过你公司业务的新员工。
- 自然语言问题/指令: 你口头交代给新员工的任务("查下今年最赚钱的产品"、"给老王发个会议通知")。
- Schema/API文档: 你给新员工看的公司业务手册/操作指南(数据库结构图、API使用说明书)。
- Prompt (提示工程): 你交代任务时说的完整、清晰、包含背景信息的话:"小张(角色扮演),这是我们的销售数据库结构(知识注入),你帮我查一下(任务类型)...(具体任务描述)"。
- SQL/API调用: 新员工看完手册,理解了你的话之后,亲手写好的查询语句/填好的系统操作单。
- 结果: 新员工把查询结果/操作结果汇报给你。
提示工程的核心价值就在于: 通过精心设计的Prompt(包含角色定义和领域知识),让原本"不懂行"的大模型助手,瞬间变成你业务领域的专家,准确地将你的"人话"需求转化为可执行的"机器指令"(SQL或API调用)。LangChain等工具则大大简化了这个过程。