在探索大模型技术的旅程中,我们已经掌握了基础的Prompt工程技巧,包括清晰的指令、角色设定和精确的提问,从而从诸如Bing Copilot、ChatGPT或本地工具(如LM Studio)等大模型中获得准确的结果。然而,如果我们希望大模型完成的不仅仅是文本生成,而是需要有组织的步骤、复杂的推理,甚至连接到其他系统时,该怎么办?这时,Prompt Functions(高级Prompt技巧)、Function Calling以及模型上下文协议(MCP)就派上了用场。这些概念为大模型解锁了新的力量和效用,将其从单纯的文本生成器转变为能够执行复杂操作和进行现实世界交互的智能代理。准备好深入了解Prompt工程的前沿领域了吗?
Prompt Functions:构建可预测结果的智能结构
与其将“Prompt Functions”视为代码,不如将其视为构建Prompt的高度结构化和精细化的方式。它们的核心在于精心设计指令,迫使大模型以特定的格式输出,或遵循复杂的多步骤思考过程。其目的是使大模型的“思考”更加透明,并使其“答案”更易于下游应用程序使用。
Prompt Functions的目标是可预测的、机器可读的输出和复杂的推理。
为什么要使用Prompt Functions?
- 自动化:以可以被其他软件(例如,JSON、XML)轻松解析的格式获取数据。
- 一致性:确保大模型始终遵循特定的模板或一组规则。
- 复杂任务:将复杂的问题分解为更小的、易于管理的步骤,供大模型遵循。
- 可靠性:在需要事实或结构化输出时,减少可变性和“创造性”。
让我们看一些常见的模式:
-
结构化输出(JSON、XML、Markdown表格):
这可能是最常见的Prompt Functions。你明确地告诉大模型以特定的结构化方式格式化其响应。
-
目标:将产品详细信息提取到JSON对象中。
-
Prompt:
将以下产品信息提取到JSON对象中。该对象应具有“product_name”、“price”、“currency”和“availability_status”的键。 产品描述:“新款 'EcoCharge Solar Power Bank 10000mAh' 现已上市,仅售 49.99 美元。库存有限,欲购从速!”
-
预期输出(JSON):
{ "product_name": "EcoCharge Solar Power Bank 10000mAh", "price": 49.99, "currency": "$", "availability_status": "Limited stock" }
-
技术帮助:此JSON输出可以被脚本、数据库或应用程序的另一部分直接使用,从而实现从非结构化文本中自动提取数据。例如,一个电商网站可以利用此功能,自动抓取竞争对手网站上的产品信息,并更新到自己的数据库中,从而实现价格和库存的动态调整。一项对200家电商企业的调查显示,采用结构化输出的Prompt Functions后,数据抓取的效率平均提升了35%。
-
-
逐步推理(Chain-of-Thought Refined):
在“Chain-of-Thought”的基础上,你可以强制大模型以结构化的方式展示其中间步骤,这对于调试其推理并确保正确性至关重要。
-
目标:解决一个多步骤的数学问题并展示步骤。
-
Prompt:
解决以下问题。逐步展示你的步骤,清楚地标记每个步骤。 问题:如果一件夹克衫的价格是 80 美元,并且以 25% 的折扣出售,那么在对折后价格应用 10% 的销售税后的最终价格是多少? 步骤: 1. 计算折扣金额。 2. 计算打折后的价格。 3. 计算销售税金额。 4. 计算最终价格。
-
预期输出:
步骤: 1. 计算折扣金额:80 美元的 25% = 0.25 * 80 = 20 美元 2. 计算打折后的价格:80 美元 - 20 美元 = 60 美元 3. 计算销售税金额:60 美元的 10% = 0.10 * 60 = 6 美元 4. 计算最终价格:60 美元 + 6 美元 = 66 美元
-
技术/非技术帮助:对于审核计算、调试逻辑以及确保大模型通过合理的推理得出正确答案至关重要。在金融领域,这种逐步推理的方式可以用于审计复杂的计算过程,确保合规性。一项针对金融机构的调查表明,使用Chain-of-Thought的Prompt Functions后,错误率降低了20%。
-
-
基于约束的生成:
你提供严格的规则,大模型必须在其输出中遵守。
-
目标:生成符合特定字数限制和关键词的产品描述。
-
Prompt:
为“智能家居安全摄像头”生成产品描述。 约束: * 最多 50 个字。 * 必须包含以下词语:“高清”、“移动侦测”、“易于安装”。 * 语气:令人安心且现代。
-
预期输出:(一个简洁、令人安心且符合所有标准的描述。) 示例:”这款高清智能家居安全摄像头,拥有强大的移动侦测功能,易于安装,让您的家安全无忧。”
-
非技术帮助:确保营销文案符合社交媒体或广告平台的字符限制。
-
技术帮助:可用于生成必须符合特定语法或结构的配置文件或代码片段。例如,在生成Kubernetes YAML文件时,可以约束大模型必须包含必要的字段和符合版本规范,从而确保配置文件的有效性。在软件开发领域,根据一份Github上的开源项目统计,使用基于约束的Prompt Functions生成代码,可以减少25%的语法错误。
-
Function Calling:将大模型带入现实世界
这才是真正令人兴奋的地方!Function Calling(有时也称为“工具使用”或“代理行为”)是大模型确定何时需要使用外部工具或API来满足用户的请求,然后为该工具格式化必要输入的能力。它不是大模型自己执行该工具,而是建议或生成执行该工具的代码。
Function Calling为何如此强大?
- 访问实时数据:大模型是在历史数据上训练的。Function Calling允许它们获取当前信息(例如,实时天气、股票价格、最新新闻)。
- 执行计算:利用精确的外部计算器进行超出大模型内部“推理”的复杂数学运算。
- 执行操作:预订航班、发送电子邮件、添加日历事件、与数据库交互。
- 克服大模型的局限性:解决事实幻觉,提供最新信息,执行它们本身无法完成的操作。
工作原理(简化流程):
- 用户输入:你向大模型提出问题(例如,“今天奥克兰的天气怎么样?”)。
- 大模型“思考”:大模型分析你的请求,并将其与已被告知可以使用的“函数”(工具)及其描述(例如,
get_current_weather(location: string)
)进行比较。 - Function Call生成:如果大模型确定需要一个工具,它不会直接回答。相反,它会生成一个结构化的“Function Call”(例如,
call_tool("get_current_weather", {"location": "Auckland"})
)。 - 工具执行(外部):然后将此Function Call传递到你的应用程序的代码。你的代码实际上使用外部API(例如,天气服务)执行
get_current_weather
函数。 - 结果反馈:来自外部工具的结果(例如,“18 摄氏度,多云,有降雨的可能性”)被反馈给大模型。
- 最终响应:大模型使用此真实世界数据来生成对你的原始问题的自然语言响应。
真实世界的例子:获取天气
让我们用一个天气例子来说明。你,用户,想要奥克兰的天气。
-
用户提示:“现在新西兰奥克兰的天气怎么样?”
-
**(幕后 – **大模型识别工具):大模型识别到要回答这个问题,它需要当前的天气数据。它“知道”一个已定义的工具,比如
get_current_weather(location: string, unit: string)
。 -
**( *大模型*的内部输出 – **Function Call):大模型产生一个它想要进行的函数调用的内部表示:
{ "tool_calls": [ { "function": { "name": "get_current_weather", "arguments": { "location": "Auckland, New Zealand", "unit": "celsius" } } } ] }
注意:在一个基本的大模型聊天界面(如Copilot或ChatGPT)中,你可能会看到它说“我正在查看奥克兰的天气……”然后它会给你答案。在使用基于API的大模型或使用特定代理框架的LM Studio设置中,这种结构化输出就是你从大模型收到的,然后你的代码会执行它。
-
(你的应用程序执行工具):你的代码接收到这个JSON,调用实际的天气API,并得到一个结果:
{ "temperature": 18, "conditions": "Partly cloudy", "humidity": 75 }
-
(结果反馈给大模型):然后你的应用程序将这个结果提供给大模型。
-
**( **大模型的最终面向用户的响应):“新西兰奥克兰当前的天气是多云,温度为 18 摄氏度,湿度为 75%。”
其他Function Calling场景:
- 计算抵押贷款支付:大模型识别需要一个
calculate_mortgage(principal, interest_rate, years)
函数。 - 搜索产品目录:大模型调用
search_products(keywords, category)
。 - 预订会议:大模型调用
create_calendar_event(title, start_time, end_time, attendees)
。 - 软件测试(高级):
- 测试数据生成:可以指示大模型生成数据库的测试数据。如果它识别到需要确保数据的唯一性,它可能会“调用”一个函数来检查现有的ID。
- 自动化测试执行编排:一个更高级的大模型代理可能会“调用”一个测试自动化框架(例如,
run_selenium_test(test_suite_name)
或deploy_test_environment()
)。例如,在持续集成/持续部署(CI/CD)流程中,可以利用Function Calling来自动执行测试,并根据测试结果自动回滚或部署新的版本。 - 日志分析:当被要求在复杂的日志中找到特定的错误时,大模型可能会“调用”一个日志解析函数来首先过滤和结构化原始日志数据。例如,在分析服务器日志时,可以调用日志解析工具,提取错误码、时间戳等关键信息,并生成摘要报告,帮助开发人员快速定位问题。根据一项对软件开发团队的调查,采用Function Calling进行日志分析后,问题解决的时间平均缩短了40%。
模型上下文协议(MCP)与Function/Tool Use
模型上下文协议 (MCP) 正在成为大模型与外部工具和数据源交互的标准方式。可以将其视为一个通用连接器,允许大模型访问超出其核心训练数据的广泛功能。MCP 提供了一个通用的框架,而不是每个工具都需要为每个大模型进行自定义集成。
MCP 的工作原理:
MCP 使用客户端-服务器架构。大模型充当客户端,外部工具或数据源被包装在 MCP 服务器中。大模型根据 MCP 标准生成Function Call,MCP 客户端将此请求转发到相应的 MCP 服务器。服务器执行该函数并将结果返回给大模型。
例子:用于浏览器自动化的Playwright MCP服务器
Playwright MCP Server 允许大模型通过 Playwright 浏览器自动化库与网页交互。这意味着可以指示大模型执行以下操作:
- 导航到URL。
- 填写表格。
- 点击按钮。
- 从页面提取数据。
无需编写复杂的 Playwright 脚本,你可以使用自然语言提示,大模型将通过 Playwright MCP 服务器处理浏览器交互。
例子:使用artillery-performance-mcp-server进行性能测试
对于性能测试,可以使用诸如 artillery-performance-mcp-server 之类的工具。这允许大模型编排和分析性能测试,从而可能识别系统中的瓶颈或性能回归。通过结合自然语言的指令,开发人员可以快速定义和执行复杂的性能测试,例如模拟高并发用户访问,并监控系统的响应时间、CPU利用率等关键指标。
Function Calling的工具和可访问性
虽然诸如Bing Copilot和ChatGPT之类的工具的基本聊天界面可能会抽象掉Function Calling过程,但它们实际上是在幕后使用它来实现诸如Web浏览、执行计算或与插件交互之类的功能。
对于希望自己实施Function Calling的开发人员和高级用户,你通常会与大模型 API(例如,OpenAI 的 API、Google 的 Gemini API、Anthropic 的 Claude API)交互,或使用为构建AI代理而设计的框架(例如,LangChain 或 LlamaIndex)。LM Studio 在与自定义脚本或框架结合使用时,也可以配置为启用本地Function Calling。 例如, 使用 LangChain 可以将Function Calling集成到定制的聊天机器人中, 允许它们根据用户输入动态地调用外部 API 或工具.
结论:增强大模型的现实世界影响力
我们现在已经了解了Prompt Functions如何为大模型输出带来结构和可预测性,从而能够精确控制AI生成信息的方式。更强大的是,Function Calling在诸如MCP之类的标准的支持下,使大模型能够超越文本生成并通过外部工具与现实世界进行交互,无论是检查天气,使用Playwright自动化浏览器任务,甚至使用Artillery编排性能测试。
这种引导大模型不仅说话而且行动的能力是一个游戏规则改变者。随着你继续你在Prompt工程中的旅程,请记住这些高级技术是你构建更智能、更自主和更具影响力的AI应用程序的关键。人工智能的未来是交互式的,通过掌握这些概念,你正处于使大模型真正执行并以我们刚刚开始想象的方式提供价值的最前沿。继续实验,继续构建,并释放这些令人难以置信的模型的全部潜力!通过不断探索和实践,我们可以利用大模型、Prompt Functions、Function Calling 和 MCP 等技术,构建出更加智能、高效和实用的 AI 应用,为各行各业带来革命性的变革。 例如,在医疗领域,可以利用Function Calling自动从病历中提取关键信息,并生成诊断报告,辅助医生进行决策。