大语言模型
大语言模型在如今很多人都多少听过,其实,大语言模型就是一种人工智能模型,通常使用深度学习技术,比如神经网络。可以将大语言模型想象为一个巨大的预测机器,其训练过程主要基于”猜词“。【也许还能说成大预言模型呢】
而 LangChian 就是一个全方面的、基于大语言模型这种预测能力的应用开发工具。本质上来说就是对各种大模型提供的API的套壳,是为了方便我们使用这些API,搭建起来的一些框架、模块和接口。
安装LangChian
安装包langchian:pip install langchian
除了安装LangChian架构本体,LangChian的使用还需要与各种模型、数据存储库集成,如OpenAI的API接口、开源大模型库HuggingFace Hub、向量数据库等。所以还需要根据需要安装这些库。接下来在需要用到某些库时会给出安装命令。
OpenAI API
OpenAI的模型有很多,具有代表性的两类就是Chat Model和Text Model。
Chat Model
聊天模型,用于产生人类和AI之间的对话,代表模型有GPT-4o和GPT-4。其他版本如gpt-3.5-turbo-0613代表ChatGPT在2023年6月13号的一个快照,而gpt-3.5-turbo-16k则代表这个模型可以接收16K长度的Token,而不是通常的4K。(传输的字节越多,花钱越多)
功能:接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)
调用 Chat 模型
准备
首先注册API Key【若学习初步不想花钱可先用火山引擎】,然后安装openai库:pip install openai;然后导入你的 OpenAI API Key:
-
直接指定api_key:
import openai openai.api_key = '你的Open API Key' -
定义环境变量:
OpenAI库就会查看名为OPENAI_API_KEY的环境变量,因此可以设定名为OPENAI_API_KEY的值(暂时定义,只作用与当前进程):
import os os.environ["OPENAI_API_KEY"] = '你的Open API Key' -
先定义系统环境变量,再获取:
建议这种,因为这样可以防止意外分享代码导致的api_key泄漏。【上面的两种方式都会暴露】
- Windows 定义环境变量:win+i打开设置—>系统信息—>高级系统设置—>环境变量—>在系统变量中新建环境变量,变量名为:
OPENAI_API_KEY,值为你的api_key。【不能使用set命令,set命令只是暂时定义,与第二种类似】 - Linux :
export OPENAI_API_KEY='你的Open API Key'
获取环境变量:使用os库中的environ的get方法【OpenAI库就会自动查看名为OPENAI_API_KEY的环境变量,因此不需要你获取】
api_key=os.environ.get("OPENAI_API_KEY")或者,你也可以考虑把环境变量保存在.env文件中,使用python-dotenv库从文件中读取它,这样也可以降低API密钥暴露在代码中的风险。
- Windows 定义环境变量:win+i打开设置—>系统信息—>高级系统设置—>环境变量—>在系统变量中新建环境变量,变量名为:
使用
先导入OpenAI库,并创建一个Client。然后调用chat下的 completions 方法,其中参数的模型指定为Chat模型,返回结果。最后打印输出大模型返回的回复的结果。
from openai import OpenAI
# 创建client
client = OpenAI()
# 指定chat模型
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a creative AI."},
{"role": "user", "content": "请给我的花店起个名"},
],
temperature=0.8,
max_tokens=60
)
# 打印返回的回复结果
print(response['choices'][0]['message']['content'])
Chat参数说明
在chat模型中,有两个专属于chat模型的概念:message(消息)和role(角色)
message:消息就是传入模型的提示。此处的messages参数是一个列表,包含了多个消息。每个消息都有一个role(可以是system、user或assistant)和content(消息的内容)。系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。
role:在OpenAI的Chat模型中,system、user和assistant都是消息的角色。每一种角色都有不同的含义和作用。
- system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。例如,你可以通过系统消息来设定一个场景,让模型知道它是在扮演一个医生、律师或者一个知识丰富的AI助手。系统消息通常在对话开始时给出。
- user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
- assistant:助手消息是模型的回复。例如,在你使用API发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。
其他参数可参考:参数说明
响应对象
当调用OpenAI的completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。一个典型的response对象可能是:
{
'id': 'chatcmpl-2nZI6v1cW9E3Jg4w2Xtoql0M3XHfH',
'object': 'chat.completion',
'created': 1677649420,
'model': 'gpt-4',
'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
'choices': [
{
'message': {
'role': 'assistant',
'content': '你的花店可以叫做"花香四溢"。'
},
'finish_reason': 'stop',
'index': 0
}
]
}
各字段含义为:
一般来说,我们需要的结果就是choices,它是一个列表【因为可以要求模型生产多个可能的输出】,每一个choice又是一个字典,包含以下字段:
- message:返回的结果,是一个字典,其中content为所回答的内容。
- finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。
Text Model
文本模型,在ChatGPT出来之前,大家都使用这种模型的API来调用GPT-3,文本模型的代表作是text-davinci-003(基于GPT3)。而在这个模型家族中,也有专门训练出来做文本嵌入的text-embedding-ada-002,也有专门做相似度比较的模型,如text-similarity-curie-001。
功能:接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)
调用 Text 模型
准备
- 准备阶段与Chat模型一致。
使用
先导入OpenAI库,并创建一个Client。然后调用 completions 方法,其中参数的模型指定为TEXT模型,返回结果。最后打印输出大模型返回的文字。
from openai import OpenAI
# 创建client
client = OpenAI()
# 指定TEXT模型
response = client.completions.create(
model="gpt-3.5-turbo-instruct", # TEXT 模型
temperature=0.5,
max_tokens=100,
prompt="请给我的花店起个名"
)
# 打印返回的文字结果
print(response.choices[0].text.strip())
Text参数说明
在使用OpenAI的文本生成模型时,你可以通过一些参数来控制输出的内容和样式。
响应对象
当调用OpenAI的completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:
我们要的结果一般是choices,它是一个列表【因为可以要求模型生产多个可能的输出】,而每一个choices又是一个字典,包含以下字段:
- text:模型生成的文本。
- finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。
Chat模型 vs Text模型
应该根据具体的应用场景选择具体的模型:
相较于Text模型,Chat模型的设计更适合处理对话或者多轮次交互的情况。
Chat模型设计的优点
- 对话历史的管理:通过使用Chat模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。
- 角色模拟:通过system角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。当然在Text模型中,你在提示中也可以为AI设定角色,作为输入的一部分。
Text模型设计的优点
对于简单的单轮文本生成任务,使用Text模型可能会更简单、更直接。
通过LangChain调用Text和Chat模型
上面的调用过程是直接OpenAI API,但应用不只是需要这个模型,LangChain可以将多个模型“链接”起来,比如“图片转文字解释模型”—>“根据图片信息处理图片的OpenAI API”—>“文字转语音模型”等就可以用LangChain进行“链接”起来。
现在只是给出一个大致的调用过程,后面会详细解释。
调用Chat模型
import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain_openai.chat_models import ChatOpenAI
chat = ChatOpenAI(
model="gpt-4",
temperature=0.8,
max_tokens=60
)
from langchain.schema import (
HumanMessage,
SystemMessage
)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="请给我的花店起个名")
]
response = chat.invoke(messages)
print(response)
调用Text模型
import os
from langchain_openai import OpenAI
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
llm = OpenAI(
model="gpt-3.5-turbo-instruct",
temperature=0.8,
max_tokens=60,
)
response = llm.invoke("请给我的花店起个名") # pridict已经遗弃,invoke和ainvoke替代
print(response)
火山引擎
首先创建账号,然后通过火山方舟管理控制台 (volcengine.com)创建api_key;然后再模型推理的在线推理中创建推理接入点,模型推荐选Doubao-pro-32k,然后在创建的接入点的操作中选择API调用,选择第三方SDK调用实例。就可以根据实例代码得到base_url和model endpoint id了。
可以看出与直接调用OpenAI API是差不多的,只是创建client时需要指定base_url【openai也可以,使用API代理服务提高访问稳定性】和api_key【openai自动找环境变量中的OPENAI_API_KEY】。
LangChian调用豆包
首先下载包:langchain-openai,可以使用命令:pip install langchain-openai。在环境变量中记得定义ARK_API_KEY、BASE_URL、LLM_MODELEND,分别对应api_key、base_url和model。
import os
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
chat = ChatOpenAI(
api_key = os.environ.get("ARK_API_KEY"),
base_url = os.environ.get("BASE_URL"),
model = os.environ.get("LLM_MODELEND"),
temperature = 0.8,
max_tokens = 600,
)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="1+1=?"),
]
# 非流式输出
response = chat.invoke(messages)
print(response.content.strip())
# 流式输出
for chunk in chat.stream(messages):
print(chunk.content,end="")
PyCharm中设定环境变量
当你在PyCharm中运行程序时,程序无法使用定义的环境变量(可能是不自动刷新或者程序作为PyCharm的子程序,PyCharm在运行过程中不会去获取系统变量...),但使用命令启动程序就可以获取到定义的环境变量;这时可以在PyCharm定义环境变量:设置—> 工具 —> 终端 —> 项目下的环境变量,然后定义环境变量即可。