纲要
- 环境准备与基础依赖
- Python 版本要求与虚拟环境配置
- 核心依赖包:
langchain、langchain-openai、langchain-core、python-dotenv - 环境变量配置:
OPENAI_API_KEY与OPENAI_BASE_URL
- LangChain 三大基础模块
- 大模型组件(
ChatOpenAI):应用的大脑 - 提示词模板(
ChatPromptTemplate):指令参数化与动态构建 - 输出解析器(
CommaSeparatedListOutputParser):从文本到结构化数据
- 大模型组件(
- 构建首个链式应用:起名大师
- 任务定义:基于国家与性别生成文化适配的名字列表
- 代码演进:
- 直接调用模型
- 引入提示词模板进行参数化
- 集成输出解析器以获取结构化结果
- 完整可运行示例
- 开发环境选项
- 在线 IDE 的优势与局限
- 本地开发环境的推荐实践
环境准备与基础依赖
在开始构建 LangChain 应用之前,需要确保 Python 环境就绪。推荐使用 Python 3.12 或更高版本,并创建一个独立的虚拟环境以隔离项目依赖。
安装核心依赖
使用pip安装以下必需的包:
pipinstalllangchain langchain-openai langchain-core python-dotenvlangchain:核心框架库。langchain-openai:OpenAI 模型的 LangChain 集成。langchain-core:包含基础抽象类和核心组件。python-dotenv:用于从.env文件加载环境变量。
配置 API 密钥
在项目根目录下创建.env文件,并添加以下内容:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx OPENAI_BASE_URL=https://api.openai.com/v1OPENAI_API_KEY是必填项。OPENAI_BASE_URL为可选配置,在需要代理或使用兼容 OpenAI 接口的第三方服务(如 DeepSeek、通义千问等)时可进行设置。
LangChain 三大基础模块
LangChain 应用的核心架构由三个基础模块串联而成:大模型组件、提示词模板和输出解析器。理解这三者的职责是掌握 LangChain 开发范式的关键。
| 模块 | 作用 | 常用类 |
|---|---|---|
| 大模型组件 | 接收提示词并生成文本回复 | ChatOpenAI |
| 提示词模板 | 将指令参数化,动态构造提示词 | ChatPromptTemplate |
| 输出解析器 | 将模型的自然语言输出转换为结构化数据(如列表、JSON) | CommaSeparatedListOutputParser,JsonOutputParser |
这三个模块通过 LangChain 表达式语言(LCEL)的管道符|进行串联。数据在链(Chain)中从左至右依次流经各模块,形成清晰的处理流程。
构建首个链式应用:起名大师
本部分将通过一个“起名大师”应用的开发过程,演示上述三个模块如何协同工作。该应用根据指定的国家文化和性别,生成一组符合背景的名字,并以 Python 列表形式输出。
第 1 步:直接调用模型
最基础的方式是直接实例化模型对象,并向其发送硬编码的提示词。
fromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenvimportos load_dotenv()llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,openai_api_key=os.getenv("OPENAI_API_KEY"),openai_api_base=os.getenv("OPENAI_BASE_URL"),)response=llm.invoke("帮我起一个具有中国特色的男孩名字")print(response.content)这种方法虽然直观,但存在明显缺陷:提示词与业务逻辑耦合,无法动态适配不同场景,且返回的非结构化文本不便于程序消费。
第 2 步:引入提示词模板
使用ChatPromptTemplate将提示中的可变部分抽取为参数,实现提示词的动态构建。
fromlangchain_core.promptsimportChatPromptTemplate prompt=ChatPromptTemplate.from_messages([("system","你是一个专业的起名大师。"),("human","请帮我起一个具有{country}特色的{boy_or_girl}名字,只返回名字本身,不要多余解释。")])formatted_prompt=prompt.invoke({"country":"美国","boy_or_girl":"男孩"})print(formatted_prompt.to_messages())通过这种方式,可以通过改变传入参数字典轻松适配不同场景。注意提示中已添加了对输出格式的约束(“只返回名字本身”),这有助于简化后续解析工作。
第 3 步:集成输出解析器
为了生成多个名字并获得结构化输出,可以使用CommaSeparatedListOutputParser。该解析器会引导模型以逗号分隔的格式返回结果,并将其自动转换为 Python 列表。
fromlangchain_core.output_parsersimportCommaSeparatedListOutputParser parser=CommaSeparatedListOutputParser()print(parser.get_format_instructions())get_format_instructions()方法会生成一段格式说明,告知模型应以何种格式返回数据。我们需要在提示词中引用这段说明。
将三者通过 LCEL 串联成链:
chain=prompt|llm|parser result=chain.invoke({"country":"中国","boy_or_girl":"男孩","format_instructions":parser.get_format_instructions()})print(result)# 输出:['狗蛋', '铁柱', '建国', '志强']print(type(result))# <class 'list'>至此,我们完成了一个完整的链式应用。它接收参数,通过动态提示词调用模型,并最终输出结构化数据。
完整可运行代码
将以下代码保存为name_master.py,并在确保.env文件配置正确后运行。
importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportCommaSeparatedListOutputParser load_dotenv()llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,openai_api_key=os.getenv("OPENAI_API_KEY"),openai_api_base=os.getenv("OPENAI_BASE_URL"),)prompt=ChatPromptTemplate.from_messages([("system","你是一个专业的起名大师。"),("human","请帮我起4个具有{country}特色的{boy_or_girl}名字,""仅返回用逗号分隔的名字,不要序号,不要解释。\n{format_instructions}")])parser=CommaSeparatedListOutputParser()chain=prompt|llm|parserif__name__=="__main__":params={"country":"美国","boy_or_girl":"男孩","format_instructions":parser.get_format_instructions(),}names=chain.invoke(params)print("生成的名字列表:",names)fori,nameinenumerate(names,1):print(f"{i}.{name.strip()}")运行结果示例:
生成的名字列表: ['James', 'William', 'Liam', 'Benjamin'] 1. James 2. William 3. Liam 4. Benjamin若遇到网络连接问题,可考虑更换为国内可访问的模型端点,或调整temperature参数。temperature值越低(如 0.0),生成结果越确定;值越高(如 0.9),创造性越强。
开发环境选项
对于初学者,在线 AI 开发平台(如 Google Colab 等)提供了“零配置”的便利性,预装了主流库并支持浏览器内运行。这适合快速验证原型或进行小型实验。
然而,在线环境通常存在资源限制,且可能不支持异步流式输出、多线程等高级特性。推荐的学习路径是先通过在线环境熟悉核心 API,再迁移至本地开发环境,以便充分利用调试工具和系统资源,为构建更复杂的 Agent 或 RAG 应用打下基础。
API 速览
langchain_openai.ChatOpenAI
OpenAI 大语言模型的 LangChain 集成类。
- 所属库:
langchain-openai - 方法签名:
ChatOpenAI(model: str, temperature: float, openai_api_key: str, openai_api_base: Optional[str] = None) - 关键参数:
model(str): 模型名称,如gpt-3.5-turbo,gpt-4。temperature(float): 控制生成随机性,取值范围 0.0 到 1.0。openai_api_key(str): OpenAI API 密钥。openai_api_base(str, optional): API 基础 URL,用于自定义端点或代理。
- 常用方法:
invoke(input: str) -> BaseMessage,用于发送提示并获取响应。
langchain_core.prompts.ChatPromptTemplate
用于创建多轮对话提示词模板的类。
- 所属库:
langchain-core - 创建方法:
from_messages(messages: List[Tuple[str, str]]) -> ChatPromptTemplate - 参数: 消息列表,每个元素为
(角色, 内容)元组。内容中可使用{变量名}作为占位符。 - 常用方法:
invoke(kwargs: dict) -> PromptValue,传入参数字典,返回格式化后的提示词对象。
langchain_core.output_parsers.CommaSeparatedListOutputParser
将模型输出的逗号分隔列表解析为 Python 列表的解析器。
- 所属库:
langchain-core - 方法:
get_format_instructions() -> str,返回用于指导模型输出格式的说明文本。 - 解析: 当链被调用时,该解析器会自动将模型的字符串输出转换为
List[str]。 - 版本:
langchain-core>= 0.1.0。
参考文档
官方文档
- LangChain 官方文档
- LangChain 核心概念指南
- LangChain LCEL 文档
参考链接
- OpenAI API 文档
- python-dotenv 项目地址
总结
本文系统梳理了 LangChain 的三大核心基础模块——模型、提示词模板与输出解析器,并通过一个“起名大师”的实战案例,演示了如何通过 LCEL 将它们组合成一个可运行的链式应用。
我们明确了各模块的职责分工,并提供了从基础调用到结构化输出的完整代码演进过程。文章强调了对提示词模板进行参数化以提升灵活性,以及利用输出解析器将模型输出转换为程序可消费的结构化数据,这是构建可靠 AI 应用的关键环节。