LangChain 简介
LangChain 是一个用于构建语言模型应用的框架,它通过模块化设计简化了基于大型语言模型(LLM)的应用开发流程。该框架由 Harrison Chase 开发并于2022年10月首次发布,现已发展成为AI应用开发领域的重要工具。
核心功能
-
模块化组件
- 提供标准化的接口和抽象层,将复杂任务分解为可重用的组件
- 包括模型调用、记忆管理、数据检索等核心功能模块
-
链式调用
- 支持将多个LLM调用串联起来形成工作流
- 可构建复杂的多步骤推理过程
-
数据增强生成
- 整合外部数据源和知识库
- 实现基于上下文的信息检索和生成
主要模块
-
模型交互
- 支持OpenAI、Anthropic等主流API
- 提供统一的接口规范
-
记忆管理
- 短期记忆(会话状态维护)
- 长期记忆(向量存储集成)
-
代理系统
- 支持工具调用和决策制定
- 可配置的行动计划和执行策略
应用场景
-
智能问答系统
- 构建具有领域知识的问答助手
- 示例:医疗咨询、技术支持机器人
-
文档处理
- 长文本摘要和分析
- 合同条款提取和解析
-
数据分析
- 自然语言查询数据库
- 自动生成数据报告
技术优势
-
开发效率
- 减少样板代码
- 快速原型开发
-
可扩展性
- 支持自定义组件
- 灵活的架构设计
-
社区生态
- 丰富的第三方集成
- 活跃的开发者社区
典型工作流程
- 初始化语言模型
- 配置必要组件(记忆、3. 定义处理4. 执行并优化应用
Lang检索器等) 链或代理 Chain 持续更新迭代,目前已支持Python和JavaScript两种主流编程语言实现,为开发者提供了构建下一代AI应用的强大工具集。
安装依赖
pip install --upgrade --quiet langchain-core langchain-community langchain-openai
编写代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# API Key
openai_api_key = "sk-xxx"
# 本地没有代理的话 这里需要可以访问的机器帮忙转发
openai_api_base = "http://xxx:3000/v1"
# Template 模板 {xxx} 中的内容可以替换
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(
openai_api_base=openai_api_base,
openai_api_key=openai_api_key,
model="gpt-3.5-turbo",
)
# 定义输出
output_parser = StrOutputParser()
# 链条: 按顺序 prompt -> model -> output_parser
chain = prompt | model | output_parser
# 执行 替换模板
message = chain.invoke({"topic": "cat"})
# 打印结果
print(message)
LCEL(LangChain Expression Language)
概述
LCEL(LangChain Expression Language)是LangChain框架提供的一种声明式编程语言,专门为构建和组合语言模型应用而设计。它允许开发者通过简洁的表达式语法来定义复杂的工作流,而无需编写大量样板代码。
核心特性
-
链式组合:支持将不同组件(如LLM、提示模板、输出解析器等)以链式方式组合
-
声明式语法:采用Pythonic的声明式语法,使代码更易读易维护
-
自动并行化:能自动识别可以并行执行的组件
-
错误处理:内置错误处理和重试机制
-
流式支持:原生支持流式输出处理
典型应用场景
# 示例:构建一个简单的问答链
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.llms import Ollama
prompt = ChatPromptTemplate.from_template(
"基于以下上下文回答问题:\n\n{context}\n\n问题: {question}"
)
llm = Ollama(model="llama2")
output_parser = StrOutputParser()
chain = prompt | llm | output_parser # 使用LCEL的管道操作符组合组件
高级功能
- 条件分支:支持基于条件执行不同路径
- 动态路由:可以根据输入内容动态选择处理路径
- 批处理:支持批量处理输入以提高效率
- 记忆功能:可与对话记忆系统集成
优势比较
| 特性 | 传统方式 | LCEL方式 |
|---|---|---|
| 代码量 | 需要大量样板代码 | 简洁的声明式语法 |
| 可维护性 | 随着复杂度增加而降低 | 保持高可读性 |
| 并行优化 | 需要手动实现 | 自动处理 |
| 错误处理 | 需要单独实现 | 内置支持 |
LCEL通过提供标准化的组件连接方式,显著简化了LangChain应用的开发流程,使开发者能够专注于业务逻辑而非基础设施代码。
执行流程
chain = prompt | model | output_parser
它的执行顺序是:prompt → model → output_parser
运行结果
Why was the cat sitting on the computer? Because it wanted to keep an eye on the mouse!