【课程链接】
<智见无极>官网
【适用人群】
- 入门学习Langchain的同学
- 轻体验ChatOpenAI的同学,平台提供Api-key,应该是很小的token额度,仅供练习
课程笔记大纲
1. 模型、提示词模板和解析器的定义
2. OpenAI 原生与 LangChain 的模型调用对比
3. 模型的支持
4. 提示词模板(prompt)
5. 解析器
6. 代码实践
在本节中,我们将深入探讨三个核心概念:模型、提示词和解析器,它们是构建任何语言模型应用的基础。
- 模型是应用的核心,负责处理输入并生成输出。
- 提示词是指导模型生成预期结果的输入文本,
- 而解析器则将模型的输出转换为结构化数据,便于后续处理。
模型、提示词模板和解析器的定义
模型、提示词模板和解析器在人工智能 LLM 应用程序中的关键作用, 这三个概念是构建智能系统和应用程序的基础。
首先,我们将对这些概念进行简要定义:
- 模型(Model):在 LangChain 框架中,模型指的是 LangChain 的模型包装器。由于 LangChain 并不提供模型,它封装了市面上的大模型厂商的 API,开发者可以使用这些包装器,调用模型厂商的 API 能力。
而人工智能领域的模型指的是一种经过训练的算法,它能够接收输入数据,基于学习到的模式和规则,生成相应的输出结果。例如,GPT 模型通过分析大量文本数据,学习语言的结构和模式,从而能够生成连贯且有意义的文本输出。在自然语言处理中,模型通常是大型语言模型,如 GPT(Generative Pre-trained Transformer)模型。我们教程中使用的模型均为 GPT 模型,默认使用 OpenAI 的“gpt-3.5-turbo”。
-
提示词模板(Prompt Template):提示词是一段精心设计的文本,用于引导模型根据特定的上下文生成目标输出。它们不仅包含输入信息,还可能包含对期望结果的描述,从而对模型的生成过程产生指导作用。
-
解析器(Parser):解析器的作用是将模型生成的非结构化文本转换为结构化数据。这一过程涉及提取关键信息,并将其组织成易于计算机程序处理的格式,以便于后续的数据存储、检索和分析。
环境配置
import os
API_SECRET_KEY = "填写【个人资料】中获取的最新token"
BASE_URL = "https://www.ai360labs.com/openai/v1/"
os.environ["OPENAI_API_KEY"] = API_SECRET_KEY
os.environ["OPENAI_BASE_URL"] = BASE_URL
import openai
from langchain_openai import ChatOpenAI,OpenAI
OpenAI原生调用
OpenAI原生的chat API 被视为行业的标准调用方式。其他模型厂商的API接口都跟OpenAI的调用方式雷同。学习了OpenAI的方式,等同于学习了整个行业的标准。
定义一个辅助函数 get_completion
,你可以使用get completion来询问1加1等于什么,这将调用ChatGPT,或技术上说是模型GPT 3.5 Turbo
,来给你回答。
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{
"role": "user", "content": prompt}]
response = openai.chat.completions.create(model=model,messages=messages)
return response.choices[0].message.content
输入你的问题。
print(get_completion("中国的首都是哪里?"))
中国的首都是北京市。
为了激发对LangChain模型、提示和解析器抽象的兴趣,假设你需要一个翻译助理,帮你翻译客户发来的邮件。
提示词可以使用模板字符串,包含变量,比如要设置不同的说话口吻,选择不同的邮件内容,就将口吻和邮件内容设置为一个变量。
最后的prompt使用f-string拼接一体。例如在线代码的{style}
和{customer_email}
。
customer_email = """
Arrr, I be fuming that me blender lid \
flew off and splattered me kitchen walls \
with smoothie! And to make matters worse,\
the warranty don't cover the cost of \
cleaning up me kitchen. I need yer help \
right now, matey!
"""
为了解决这个问题,我们将要求这个LLM将邮件翻译中文,并保持冷静和尊重的语气。
style = "保持冷静和尊重的语气"
请你尝试尝试修改提示,看看你是否能得到不同的输出。修改风格或者邮件内容,指导大型语言模型完成翻译任务。
prompt = f"""我不懂英语,现在请你为我翻译客户的邮件为中文。 \
翻译的风格是:{
style}。\
需要翻译的内容是: ```{
customer_email}```
"""
print(prompt)
我不懂英语,现在请你为我翻译客户的邮件为中文。 翻译的风格是:保持冷静和尊重的语气。需要翻译的内容是:
```
Arrr, I be fuming that me blender lid flew off and splattered me kitchen walls with smoothie! And to make matters worse,the warranty don’t cover the cost of cleaning up me kitchen. I need yer help right now, matey!
```
response = get_completion(prompt)
response
‘尊敬的客服团队,\n\n我非常生气,因为我的搅拌机盖子飞了起来,洒了一地的水果奶昔,弄得厨房墙壁一片狼藉!更糟糕的是,保修不包括清理厨房的费用。请您立即提供帮助,非常感谢!\n\n此致, \n[您的名字]’
如果你有不同的客户以不同的语言写评论,不仅仅是英语,还有法语、德语、日语等,你可以想象需要生成一系列提示来生成这样的翻译。
LangChain封装调用
现在我们看看LangChain又是如何达成这个目标的。还记得创始人为什么发明LangChain吗?在LLM的编程实践中,AI开发者需要很多胶水代码。LangChain做了很多这样的抽象,简化AI开发者的编程。
LangChain的设计目标之一是简化AI开发者的工作流程,减少对不同模型厂商API的依赖和学习成本。
使用LangChain后,我们无需封装每个模型厂商的API函数,也无需查看每个模型厂商的API格式。
LangChain提供了一套统一的接口和抽象,使得开发者可以更方便地使用不同模型厂商的模型。