好的,这是一篇关于如何使用 LangChain API 调用语言模型的详细文章,并附有代码示例。
LangChain 核心功能:轻松调用大语言模型(附代码示例)
在大语言模型(LLM)应用开发中,直接与各种模型 API 进行交互可能会变得复杂和繁琐。不同的模型提供商(如 OpenAI、Google、Anthropic)有不同的 SDK 和数据格式。LangChain 的核心价值之一就是提供了一个统一、标准化的接口来与这些模型进行交互,极大地简化了开发流程。
本文将详细介绍如何通过 LangChain 调用语言模型,并提供清晰的代码示例,帮助您快速上手。
LangChain 的模型抽象:两种基本类型
LangChain 将模型抽象为两种主要类型,以适应不同的应用场景:
- LLMs: 这是对传统文本补全模型的封装。您输入一段文本(prompt),它会返回一段补全的文本。这种模型适合简单的问答或文本生成任务。
- ChatModels: 这是对更先进的对话模型的封装。它的输入是“消息列表”(List of Messages),输出也是一个“消息”(Message)。这种结构更适合构建多轮对话的聊天机器人,因为它能更好地处理上下文和角色扮演。
在当前的开发实践中,ChatModels 是更常用、更推荐的选择,因为它们通常是更新、更强大的模型(如 GPT-4、Claude 3),并且其基于消息的输入方式更加结构化和灵活。
第一步:环境准备与安装
在开始之前,请确保您已经安装了必要的 Python 库。我们将以 OpenAI 的模型为例,因此需要安装 langchain-openai。
pip install langchain langchain-openai python-dotenv
为了安全地管理您的 API 密钥,建议使用 .env 文件。在您的项目根目录下创建一个名为 .env 的文件,并写入以下内容:
OPENAI_API_KEY="sk-YourOpenAI_API_Key"
第二步:调用聊天模型(ChatModels)- 推荐方式
ChatModels 是构建现代 LLM 应用的基础。它的交互模式模仿了真实的对话,通过不同角色的消息(如 SystemMessage, HumanMessage, AIMessage)来构建上下文。
1. 基本调用
最简单的调用方法是实例化一个 ChatOpenAI 对象,并向其传递一个消息列表。
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 加载 .env 文件中的环境变量
load_dotenv()
# 1. 初始化模型
# model_name 可以指定具体的模型,如 "gpt-4", "gpt-3.5-turbo"
# temperature 控制输出的随机性,0 表示最确定,1 表示最随机
chat = ChatOpenAI(model_name="gpt-4o", temperature=0)
# 2. 准备输入消息
# SystemMessage 定义了 AI 的角色和行为准则
# HumanMessage 代表用户的输入
messages = [
SystemMessage(content="你是一名专业的旅行规划师。"),
HumanMessage(content="我应该去哪里度过一个为期三天的浪漫周末?请推荐一个城市并说明理由。"),
]
# 3. 调用模型并获取响应
# .invoke() 方法是 LangChain 中执行调用的标准方法
response = chat.invoke(messages)
# 4. 打印结果
print("AI的回答:")
print(response.content)
# AIMessageChunk(content='当然!对于一个为期三天的浪漫周末,我强烈推荐**法国的巴黎**。\n\n**理由如下:**\n\n1. **无与伦比的浪漫氛围**:巴黎被誉为“爱之城”,其街道、塞纳河畔、古老的建筑和迷人的咖啡馆都充满了浪漫气息。与伴侣在蒙马特高地漫步,或是在埃菲尔铁塔下欣赏夜景,都是非常难忘的体验。\n\n2. **世界级的艺术与文化**:你们可以参观卢浮宫,欣赏《蒙娜丽莎》的微笑;也可以去奥赛博物馆,沉浸在印象派的画作中。丰富的艺术展览为你们的旅行增添了文化深度。\n\n3. **精致的美食体验**:从米其林星级餐厅到街角的面包店,巴黎的美食总能满足你的味蕾。一起品尝法式蜗牛、马卡龙和现烤的可颂面包,享受味觉上的盛宴。\n\n4. **便捷的交通**:巴黎的公共交通系统非常发达,地铁可以轻松带你们到达城市的任何一个角落,让你们在有限的时间里高效地游览。')
在这个例子中,SystemMessage 告诉模型它应该扮演什么角色,而 HumanMessage 则是用户的具体问题。模型的返回结果是一个 AIMessage 对象,其 .content 属性包含了生成的文本。
第三步:结合 PromptTemplate 和 LCEL 实现模块化调用
在实际应用中,我们很少直接硬编码提问。更好的方式是使用 PromptTemplate 来动态地构建输入。LangChain 表达式语言(LCEL)则提供了一种优雅的方式将提示、模型和输出解析器“链接”在一起。
这被认为是 LangChain 的标准实践。
1. 创建提示模板
ChatPromptTemplate 允许我们定义一个包含变量的对话结构。
from langchain_core.prompts import ChatPromptTemplate
# 创建一个包含输入变量 {topic} 的模板
prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一名专业的文案撰写人,擅长写出吸引人的社交媒体帖子。"),
("human", "为关于“{topic}”的产品写一个三句话的推广文案。"),
]
)
2. 使用 LCEL 构建调用链
LCEL 使用管道符 | 将不同的组件链接在一起,形成一个处理流水线。这使得代码非常简洁且易于理解。
# 使用 LCEL 将 prompt, model 链接在一起
# 这是一个简单的 Chain (调用链)
chain = prompt_template | chat
# 调用链,并传入变量
response = chain.invoke({"topic": "新款智能手表"})
print("文案内容:")
print(response.content)
# 文案内容:
# 准备好迎接未来的科技浪潮了吗?我们的新款智能手表不仅是时间的记录者,更是您手腕上的健康伙伴和智能助理。现在就体验前所未有的便捷与时尚,让每一刻都充满智慧。
这种方法的优势在于:
- 可重用性:
prompt_template和chain可以被重复使用,只需传入不同的topic。 - 模块化:可以轻松地在链中添加或替换组件,例如在最后加上一个输出解析器
| StrOutputParser()。
第四步:调用传统 LLMs(较少使用)
虽然 ChatModels 是主流,但了解如何调用基本的 LLM 也是有帮助的。其接口更简单,只接受和返回字符串。
from langchain_openai import OpenAI
# 1. 初始化 LLM 模型
# 注意这里导入的是 OpenAI,而不是 ChatOpenAI
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0)
# 2. 准备输入文本
text = "请解释一下什么是黑洞?"
# 3. 调用并打印结果
response = llm.invoke(text)
print(response)
# 黑洞是一种极其神秘和强大的天体,它的引力非常巨大,以至于任何物质,甚至光,都无法逃脱它的引力范围。
# ... (省略部分输出)
结论
LangChain 通过其标准化的 ChatModels 和 LLMs 接口,以及强大的 PromptTemplate 和 LCEL,彻底改变了与大语言模型交互的方式。对于新项目,强烈建议遵循以下最佳实践:
- 优先使用
ChatModels,因为它更强大且输入结构更清晰。 - 利用
ChatPromptTemplate管理你的提示,使其动态化和可重用。 - 拥抱 LangChain 表达式语言(LCEL),通过
|符号构建清晰、模块化的调用链。
掌握了这些核心技巧,您就已经迈出了使用 LangChain 构建复杂、强大且可靠的 LLM 应用的关键一步。