使用 LangChain 构建应用
LangChain 是一个旨在简化大型语言模型(LLM)应用的开发框架。它支持将外部数据源和计算源连接到 LLM,从而构建功能丰富的应用程序。本文将重点介绍 LangChain 中最基础的组件之一——LLMChain,并逐步展示如何从简单的提示响应扩展到更复杂的链式调用。
环境准备与安装
在使用 LangChain 之前,需要确保 Python 环境已配置好。LangChain 支持通过 API 提供的模型(如 OpenAI)和本地开源模型(如 Ollama)。
首先,安装必要的依赖包。对于 OpenAI 集成,需要安装 langchain-openai 包:
pip install langchain-openai
同时,建议安装核心包以确保兼容性:
pip install langchain-core
访问 API 需要一个有效的密钥。您可以通过注册 OpenAI 账户获取该密钥。为了安全起见,建议将密钥设置为环境变量,而不是硬编码在代码中。
设置环境变量示例(Linux/Mac):
export OPENAI_API_KEY="sk-..."
Windows 用户可以使用 setx 或在系统属性中配置。
初始化模型
安装完成后,我们可以初始化模型。以下示例使用 OpenAI 的 Chat 模型。
方式一:使用环境变量
如果已设置环境变量,可以直接实例化:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
方式二:直接传入密钥
如果不希望设置环境变量,可以在启动类时直接通过命名参数传入密钥:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(openai_api_key="sk-...")
注意:在生产环境中,请避免将密钥硬编码在代码中,建议使用 .env 文件和 python-dotenv 库来管理敏感信息。
测试模型调用
一旦安装并初始化了 LLM,就可以尝试调用它。例如,询问关于历史人物的问题:
response = llm.invoke("介绍一下李白?")
print(response)
输出通常是一个 AIMessage 对象,包含内容字段:
AIMessage(content='李白(701 年-762 年),字太白,号青莲居士,唐朝时期伟大的浪漫主义诗人...')
虽然可以直接使用,但在大多数应用中,我们更倾向于处理字符串格式的数据。因此,我们需要引入输出解析器。
构建提示模板
提示模板(Prompt Template)用于将原始用户输入转换为更适合 LLM 理解的格式。通过定义 System Message 和 User Message,可以控制模型的语气、角色和回答风格。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是世界级的历史人物研究人员,擅长用一句话输出回答。"),
("user", "{input}")
])
这里使用了 {input} 作为占位符,将在运行时被实际的用户输入替换。
创建 LLMChain
LangChain 提供了流畅的表达式语言(LCEL),允许使用管道操作符 | 将多个组件连接起来。这比传统的 RunnableWithMessageHistory 或旧版 Chain 更加简洁高效。
基础链
将提示模板与模型组合:
chain = prompt | llm
调用链:
result = chain.invoke({"input": "请介绍一下李白?"})
print(result.content)
输出将被限制为系统提示词要求的格式:
李白,唐朝浪漫主义诗人,被誉为'诗仙'。
添加输出解析器
为了将 AIMessage 对象转换为纯字符串,方便后续处理,我们可以添加 StrOutputParser:
from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
再次调用:
response = chain.invoke({"input": "请介绍一下李白?"})
print(type(response)) # <class 'str'>
print(response)
现在返回的是直接的字符串,无需再访问 .content 属性。
进阶:流式响应处理
在实际应用中,为了提升用户体验,通常希望看到模型生成的文字逐字显示,而不是等待整个响应完成。LangChain 支持流式输出。
for chunk in chain.stream({"input": "请介绍一下李白?"}):
print(chunk, end="", flush=True)
这将逐个打印生成的文本块,实现打字机效果。
本地模型部署
除了使用云端 API,LangChain 也支持本地开源模型,如 Ollama。这依赖于硬件配置,适合对数据隐私有要求或预算有限的场景。
以 Ollama 为例,需先安装 Ollama 服务并拉取模型(如 llama3):
ollama pull llama3
然后在代码中初始化:
from langchain_community.chat_models import ChatOllama
llm_local = ChatOllama(model="llama3", temperature=0.7)
chain_local = prompt | llm_local | output_parser
这种方式无需网络请求即可运行,但速度取决于本地算力。
最佳实践与安全建议
- 密钥管理:始终使用环境变量或密钥管理服务(如 AWS Secrets Manager)存储 API Key,切勿提交到版本控制系统。
- 错误处理:网络波动或 API 限流可能导致调用失败,建议在代码中添加 try-except 块进行重试或降级处理。
- 成本控制:Token 消耗会产生费用,可通过限制最大 token 数或使用低成本模型来控制成本。
- 提示词工程:优化 System Prompt 能显著提升回答质量,建议对关键指令进行明确约束。
- 缓存机制:对于相同的输入,可以考虑缓存结果以减少重复调用,降低延迟和费用。
总结
本文详细讲解了 LangChain 中 LLMChain 的基本使用方法。通过组合提示模板、模型和输出解析器,开发者可以快速构建基于大语言模型的应用原型。掌握了 LLMChain 后,后续可以进一步学习检索增强生成(RAG)、代理(Agent)以及多步链等高级功能,以应对更复杂的企业级需求。
在构建应用时,请始终关注安全性、稳定性和成本效益,根据实际业务场景选择合适的模型和架构方案。

