Merge pull request #350 from xyyy9/main

Updated Chinese translation for prompt chaining & function calling
This commit is contained in:
Elvis Saravia 2024-01-04 11:31:59 -06:00 committed by GitHub
commit e459a21211
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 208 additions and 4 deletions

View File

@ -1,3 +1,107 @@
# Function Calling with LLMs
# 在LLM中调用函数
This page needs a translation! Feel free to contribute a translation by clicking the `Edit this page` button on the right.
## 调用函数
函数调用是指可靠地连接LLM与外部工具的能力。让用户能够使用高效的外部工具、与外部API进行交互。
GPT-4和GPT-3.5是经过微调的LLM能够检测函数是否被调用随后输出包含调用函数参数的JSON。通过这一过程被调用的函数能够作为工具添加到您的AI应用中并且您可以在单个请求中定义多个函数。
函数调用是一项重要能力。它对于构建LLM驱动的聊天机器人或代理至关重要。这些聊天机器人或代理需要为LLM检索上下文。它们还与外部工具交互。这种交互是通过将自然语言转换为API调用来完成的。
函数调用使开发者能够创建:
- 能够高效使用外部工具回答问题的对话代理。例如,查询“伯利兹的天气如何?”将被转换为类似`get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')`的函数调用
- 用于提取和标记数据的LLM驱动解决方案例如从维基百科文章中提取人名
- 可以帮助将自然语言转换为API调用或有效数据库查询的应用程序
- 能够与知识库交互的对话式知识检索引擎
在这份指南中我们展示了如何针对GPT-4和其他开源模型给出提示以执行不同的函数调用。
## 使用GPT-4进行函数调用
作为一个基本示例,假设我们要求模型检查特定地点的天气。
LLM本身无法响应此请求。因为它所使用的训练数据集截止至之前的某个日期。解决这个问题的方法是将LLM与外部工具结合起来。您可以利用模型的函数调用能力来确定要调用的外部函数及其参数然后让它返回最终回复结果。以下是一个简单的示例展示了如何使用OpenAI API实现这一点。
假设一个用户向模型提出以下问题:
```
伦敦的天气如何?
```
要使用函数调用处理此请求第一步是定义一个或一组天气函数。您将作为OpenAI API请求的一部分传递这些函数
```python
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]
```
`get_current_weather`函数能够返回指定位置的天气情况。当您将这个函数定义作为请求的一部分传递时它实际上并不执行函数只是返回一个包含调用函数所需参数的JSON对象。以下是一些如何实现这一点的代码片段。
您可以如下定义一个完整的函数:
```python
def get_completion(messages, model="gpt-3.5-turbo-1106", temperature=0, max_tokens=300, tools=None):
response = openai.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
max_tokens=max_tokens,
tools=tools
)
return response.choices[0].message
```
您可以像这样构造用户提问:
```python
messages = [
{
"role": "user",
"content": "伦敦的天气如何?"
}
]
```
最后,您可以调用`get_completion`函数,将结果传递给`response`中的`messages`和`tools`
```python
response = get_completion(messages, tools=tools)
```
`response`的构造如下所示:
```python
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='...', function=Function(arguments='{"location":"London","unit":"celsius"}', name='get_current_weather'), type='function')])
```
特别地,`arguments` 对象包含了模型提取的重要参数,这些参数将被用于完成请求。
然后您可以调用一个外部天气API来获取实际的天气信息。一旦您有了天气信息就可以将其传回模型随后根据原始用户问题总结出最终回应。
这里有一个[python notebook](https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-function-calling.ipynb)它提供了一个简单示例展示了如何使用OpenAI API进行函数调用。
## 使用开源LLM进行函数调用
更多使用开源LLM进行函数调用的说明即将推出...
## 函数调用用例
更多函数调用用例即将推出...

View File

@ -1,3 +1,103 @@
# Prompt Chaining
# 链式提示
This page needs a translation! Feel free to contribute a translation by clicking the `Edit this page` button on the right side.
import {Screenshot} from 'components/screenshot'
import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
## 简介
为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示prompt chaining一个任务被分解为多个子任务根据子任务创建一系列提示操作。
链式提示可以完成很复杂的任务。LLM可能无法仅用一个非常详细的提示完成这些任务。在链式提示中提示链对生成的回应执行转换或其他处理直到达到期望结果。
除了提高性能链式提示还有助于提高LLM应用的透明度增加控制性和可靠性。这意味着您可以更容易地定位模型中的问题分析并改进需要提高的不同阶段的性能。
链式提示在构建LLM驱动的对话助手和提高应用程序的个性化用户体验方面非常有用。
## 链式提示使用示例
### 文档问答中的链式提示
提示链可以用于不同的场景这些场景可能涉及多个操作或转换。例如LLM的一个常见用途是根据大型文本文档回答问题。想要更好阅读大文本文档可以设计两个不同的提示第一个提示负责提取相关引文以回答问题第二个提示则以引文和原始文档为输入来回答给定的问题。换句话说可以创建两个不同的提示来执行根据文档回答问题的任务。
下面的第一个提示根据问题从文档中提取相关引文。请注意,为了简化,我们为文档添加了一个占位符`{{文档}}`。要测试此提示,您可以从维基百科复制并粘贴一篇文章,例如这个关于[提示工程](https://zh.wikipedia.org/wiki/提示工程)的页面。由于此任务使用了较长的上下文我们使用了OpenAI的`gpt-4-1106-preview`模型。您也可以将此提示与其他长上下文LLM如Claude一起使用。
提示1:
```
你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文,由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文,请回应“未找到相关引文!”。
####
{{文档}}
####
```
这是整个提示的截图,包括通过`user`角色传递的问题。
<Screenshot src={PC1} alt="Prompt Chaining Part 1" />
提示1的输出
```
<quotes>
- Chain-of-thought (CoT) prompting[27]
- Generated knowledge prompting[37]
- Least-to-most prompting[38]
- Self-consistency decoding[39]
- Complexity-based prompting[41]
- Self-refine[42]
- Tree-of-thought prompting[43]
- Maieutic prompting[45]
- Directional-stimulus prompting[46]
- Textual inversion and embeddings[59]
- Using gradient descent to search for prompts[61][62][63][64]
- Prompt injection[65][66][67]
</quotes>
```
在第一个提示中返回的引文现在可以用作下面第二个提示的输入。您可以对这些引文进行清理,比如移除引用标志。可以在提示链中新建另一个提示来移除或使用这些引用标志,但现在您可以忽略这些。然后,第二个提示接收由第一个提示提取的相关引文,并根据文档和这些提取的引文生成一个有帮助的回答。第二个提示可以是以下内容:
提示2
```
根据从文档中提取的相关引文(由<quotes></quotes>分隔)和原始文档(由####分隔),请构建对问题的回答。请确保答案准确、语气友好且有帮助。
####
{{文档}}
####
<quotes>
- Chain-of-thought (CoT) prompting[27]
- Generated knowledge prompting[37]
- Least-to-most prompting[38]
- Self-consistency decoding[39]
- Complexity-based prompting[41]
- Self-refine[42]
- Tree-of-thought prompting[43]
- Maieutic prompting[45]
- Directional-stimulus prompting[46]
- Textual inversion and embeddings[59]
- Using gradient descent to search for prompts[61][62][63][64]
- Prompt injection[65][66][67]
</quotes>
```
提示2的输出
```
文档中提到的提示技术包括:
1. Chain-of-thought (CoT) prompting[27]
2. Generated knowledge prompting[37]
3. Least-to-most prompting[38]
4. Self-consistency decoding[39]
5. Complexity-based prompting[41]
6. Self-refine[42]
7. Tree-of-thought prompting[43]
8. Maieutic prompting[45]
9. Directional-stimulus prompting[46]
10. Textual inversion and embeddings[59]
11. Using gradient descent to search for prompts[61][62][63][64]
12. Prompt injection[65][66][67]
每一种技术都采用独特的策略来增强或明确与大型语言模型的互动,以产生期望的结果。
```
如您所见,简化并创建提示链是一种有用的提示方法,其中响应需要经过多个操作或转换。作为练习,您可以自由设计一个提示,它会在将响应作为最终回应发送给应用程序用户之前,移除响应中的引用标志(例如,`[27]`)。
您还可以在这份[文档](https://docs.anthropic.com/claude/docs/prompt-chaining)中找到更多关于提示链的示例这些示例利用了Claude LLM。我们的示例灵感来源于他们并采用了他们的示例。