调用 OpenAI API
- Text模型:
prompt与max_tokens参数控制生成的文本长度。简洁。 - Chat模型:消息角色:
system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。系统消息通常在对话开始时给出。user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。assistant:助手消息是模型的回复。发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。在对话的最后一条消息应始终为用户消息。
响应对象:
{
'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
}
]
}
text:生成的文本。finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。created:生成响应的时间戳。
使用OpenAI API
import os
from openai import OpenAI
# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'
client = OpenAI()
# text = client.invoke("请给我写一句情人节红玫瑰的中文宣传语")
response = client.chat.completions.create(
model=os.environ.get("LLM_MODELEND"),
messages=[
{"role": "system", "content": "You are a creative AI."},
{"role": "user", "content": "请给我的花店起个名"},
],
temperature=0.8,
max_tokens=600,
)
print(response.choices[0].message.content)
通过 LangChain 调用
我们只需要定义一次模板,更简洁。
import os
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'
chat = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0.8, max_tokens=600)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="请给我的猫起个名"),
]
response = chat(messages)
print(response)
预训练+微调的大模型应用模式:高效、扩展性
微调(Fine-tuning):对模型的头部或者部分参数根据自己的需要进行适应性的调整,这通常涉及在相对较小的有标注数据集上进行有监督学习,让模型适应特定任务的需求。 微调过程相比于从头训练一个模型要快得多,且需要的数据量也要少得多。
- 预训练:在大规模无标注文本数据上进行模型的训练,学习基本的特征和模式。
- 微调:快速地根据特定任务进行优化,使用标注好的数据集,以便模型能针对特定任务进行优化和调整。
从HuggingFace下载并导入模型使用
输出解析
得到清晰的数据结构,方便将解析好的数据存入CSV文档。
输出解析器类要实现两个核心方法:
get_format_instructions:这个方法需要返回一个字符串,用于指导如何格式化语言模型的输出,告诉它应该如何组织并构建它的回答。parse:这个方法接收一个字符串(也就是语言模型的输出)并将其解析为特定的数据结构或格式。这一步通常用于确保模型的输出符合我们的预期,并且能够以需要的形式进行后续处理。parse_with_prompt:这个方法接收一个字符串(也就是语言模型的输出)和一个提示(用于生成这个输出的提示),并将其解析为特定的数据结构。这样,你可以根据原始提示来修正或重新解析模型的输出,确保输出的信息更加准确和贴合要求。
用
output_parser.parse(output)把模型输出的文案解析成之前定义好的数据格式,也就是一个Python字典,这个字典中包含了description和reason这两个字段的值。
使用 Pydantic(JSON)解析器: 数据验证、数据转换
import os
# os.environ["OPENAI_API_KEY"] = 'Your OpenAI API Key'
# 创建模型实例
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model=os.environ.get("LLM_MODELEND"),
)
# ------Part 2
# 创建一个空的DataFrame用于存储结果
import pandas as pd
df = pd.DataFrame(columns=["flower_type", "price", "description", "reason"])
# 数据准备
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]
# 定义我们想要接收的数据格式
from pydantic.v1 import BaseModel, Field
class FlowerDescription(BaseModel):
flower_type: str = Field(description="鲜花的种类")
price: int = Field(description="鲜花的价格")
description: str = Field(description="鲜花的描述文案")
reason: str = Field(description="为什么要这样写这个文案")
# ------Part 3
# 创建输出解析器
from langchain.output_parsers import PydanticOutputParser
output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)
# 获取输出格式指示
format_instructions = output_parser.get_format_instructions()
print("输出格式:", format_instructions)
# ------Part 4
# 创建提示模板
from langchain import PromptTemplate
prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower} ,您能提供一个吸引人的简短中文描述吗?
{format_instructions}"""
# 根据模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(
prompt_template, partial_variables={"format_instructions": format_instructions}
)
# 打印提示
print("提示:", prompt)
# ------Part 5
for flower, price in zip(flowers, prices):
# 根据提示准备模型的输入
input = prompt.format(flower=flower, price=price)
# 打印提示
print("提示:", input)
# 获取模型的输出
output = model.predict(input)
# 解析模型的输出
parsed_output = output_parser.parse(output)
parsed_output_dict = parsed_output.dict() # 将Pydantic格式转换为字典
# 将解析后的输出添加到DataFrame中
df.loc[len(df)] = parsed_output.dict()
# 打印字典
print("输出的数据:", df.to_dict(orient="records"))
- 自动修复解析器
OutputFixingParser:调用了原有的PydanticOutputParser,如果失败,它会将格式错误的输出以及格式化的指令传递给大模型,并要求LLM进行相关的修复。 - 重试解析器
RetryWithErrorOutputParser:利用大模型的推理能力根据原始提示找回相关信息。
文档:LangChain中的各种 Output Parsers