书接上回,我们继续看看内容。
第三节
from langchain_openai import ChatOpenAI
langchain_openai:
- 属于 LangChain 的生态系统扩展,专门封装了与 OpenAI 模型的交互逻辑。
- 目的:简化与 OpenAI Chat API 的调用,隐藏底层的接口细节,提供更直观的高层 API。
- 优势:可以无缝集成 LangChain 的其他工具,如记忆模块(memory)或工具链(tools)。
为什么要使用langchain?和openai的库有什么区别?
OpenAI 官方 Python 库
-
定位:专注于直接调用 OpenAI 提供的 API。
-
功能:
- 提供底层访问接口,例如
completions.create(文本补全)和chat.completions.create(聊天补全)。 - 直接控制生成内容的参数(如
temperature、max_tokens等)。
- 提供底层访问接口,例如
-
适用场景:
- 单一任务,如生成内容、完成一句话、问答等。
- 用户对 API 调用逻辑非常熟悉,并愿意手动管理对话上下文等内容。
LangChain
-
定位:一个高层框架,专注于构建复杂的对话式应用。
-
功能:
- 上下文管理:自动维护对话历史和上下文,无需手动管理
messages列表。 - 工具集成:支持通过工具(Tools)执行复杂操作,例如数据库查询、API 调用、计算等。
- 链式调用:可以设计一系列任务链,模型输出可以自动作为下一个步骤的输入。
- 多模型支持:不仅限于 OpenAI,可以集成其他模型(如 Hugging Face、Cohere)。
- 记忆功能:通过 Memory 模块保存对话历史,支持长期上下文的任务。
- 上下文管理:自动维护对话历史和上下文,无需手动管理
-
适用场景:
- 构建复杂的对话式应用,如虚拟助理、知识问答系统。
- 跨多个工具协作的任务(如从数据库中查询数据后再用模型总结结果)。
ChatOpenAI 实例化
llm = ChatOpenAI(
model=os.environ.get("LLM_MODELEND"),
temperature=0.8,
max_tokens=600,
)
-
model=os.environ.get("LLM_MODELEND"):- 从环境变量中动态获取模型名称(如
gpt-3.5-turbo或gpt-4)。 - 灵活性:允许在不同场景中快速切换模型。
- 从环境变量中动态获取模型名称(如
-
temperature=0.8:-
控制生成内容的随机性和创造力:
- 0.8 是一个较高的值,适合创意类任务(如命名、文案生成)。
- 越高的值会增加生成结果的多样性。
-
-
max_tokens=600:- 限制生成回复的最大长度,防止输出过长或消耗过多 token。
- 适合任务:命名任务通常不会需要较长的输出,600 token 是足够的限制。
调用 predict 方法
response = llm.predict("请给我的花店起个名")
-
predict方法:-
是
ChatOpenAI的高层方法,用于快速生成单次任务的结果。 -
输入:只需要一个简单的字符串提示(
"请给我的花店起个名")。 -
内部逻辑:
predict方法封装了 OpenAI Chat API 的调用,无需显式构建messages列表。 -
特点:
- 适合简化任务:无须多轮对话,只关心单次生成的结果。
- 如果需要多轮对话,
predict方法可能不足够,需配合 LangChain 的记忆模块。
-
第四节
重复的部分不再赘述。
调用库
from langchain.schema import HumanMessage, SystemMessage
langchain.schema:
- 提供了定义消息结构的工具。
HumanMessage:代表用户的输入消息。SystemMessage:用来指定系统角色或约束模型的行为。
实例化与构建对话信息
chat = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0.8, max_tokens=600)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="请给我的花店起个名"),
]
-
模型实例化:
-
ChatOpenAI是 LangChain 提供的一个高层封装,用于调用 OpenAI 的聊天模型。 -
参数:
model=os.environ.get("LLM_MODELEND"):从环境变量中动态获取模型名称,方便配置。temperature=0.8:设置生成内容的随机性(偏创意性任务)。max_tokens=600:限制输出的最大长度。
-
-
构建消息列表:
-
使用
SystemMessage和HumanMessage定义对话的上下文:SystemMessage:设定系统角色,指引模型行为,这里让 AI 扮演“很棒的智能助手”。HumanMessage:表示用户输入,要求模型为花店起名字。
-
前后程序有什么区别?
后面的程序使用了 ChatOpenAI 初始化模型时,构造了一个 messages 列表,其中包含 SystemMessage 和 HumanMessage,明确了对话的上下文。模型实例化后,通过 chat(messages) 调用传递消息列表。前一个程序则直接将用户输入作为字符串传递给 predict(),没有显式地构建 SystemMessage 和 HumanMessage,适合处理单一用户输入。
后面的程序通过显式构造系统消息和用户消息,适合更复杂的上下文管理,特别是在多轮对话中,能够清晰地定义模型的行为和用户的请求。而前一个程序则适用于简单的单轮对话或直接任务,不需要明确管理消息角色。
后面的程序需要调用 chat(messages) 并且可能要进一步处理返回结果,而前一个程序通过 predict() 方法直接返回模型的生成内容,简化了响应的处理过程。
为什么我们不直接设计LLM?
直接构建 LLM(大语言模型)虽然看起来能够提供完全的控制权,但实际应用中调用 API 更加高效和可行。首先,训练一个大语言模型需要大量的计算资源、时间和资金。即使使用已有的模型,部署和维护也涉及到硬件、优化、更新等一系列复杂的问题。而通过调用 API,我们可以借助云端的强大计算力和更新能力,避免了这些繁琐的步骤。
其次,调用 API 让开发者专注于应用层面,而不必关心底层模型的实现和更新。OpenAI 和其他平台提供的 API 已经经过优化和测试,确保了模型的性能和准确性。通过 API,我们可以利用最新的研究成果和版本更新,减少了手动调整模型参数和维护版本的工作。
再者,调用 API 是一种按需付费的方式,避免了大规模部署带来的资源浪费。我们可以根据实际需求调整调用频率和计算资源,做到成本控制和高效使用。而如果自己部署模型,需要事先购买昂贵的硬件,并承担持续的维护成本。
最后,API 的易用性和集成性使得开发更为高效。平台通常提供了完善的文档和工具,简化了与模型的交互过程。对于大多数开发者来说,调用 API 可以大大节省开发时间,让他们能更快地实现想法并将其应用到实际场景中。
综合来看,调用 API 相较于自己构建 LLM,不仅在成本、时间和资源管理上更具优势,还能让开发者更专注于创新和应用层面。因此,调用 API 成为大多数开发者的首选方案。