LangChain 简介

LangChain 是一个用于构建语言模型应用的框架,它通过模块化设计简化了基于大型语言模型(LLM)的应用开发流程。该框架由 Harrison Chase 开发并于2022年10月首次发布,现已发展成为AI应用开发领域的重要工具。

核心功能

  1. 模块化组件

    • 提供标准化的接口和抽象层,将复杂任务分解为可重用的组件
    • 包括模型调用、记忆管理、数据检索等核心功能模块
  2. 链式调用

    • 支持将多个LLM调用串联起来形成工作流
    • 可构建复杂的多步骤推理过程
  3. 数据增强生成

    • 整合外部数据源和知识库
    • 实现基于上下文的信息检索和生成

主要模块

  1. 模型交互

    • 支持OpenAI、Anthropic等主流API
    • 提供统一的接口规范
  2. 记忆管理

    • 短期记忆(会话状态维护)
    • 长期记忆(向量存储集成)
  3. 代理系统

    • 支持工具调用和决策制定
    • 可配置的行动计划和执行策略

应用场景

  1. 智能问答系统

    • 构建具有领域知识的问答助手
    • 示例:医疗咨询、技术支持机器人
  2. 文档处理

    • 长文本摘要和分析
    • 合同条款提取和解析
  3. 数据分析

    • 自然语言查询数据库
    • 自动生成数据报告

技术优势

  1. 开发效率

    • 减少样板代码
    • 快速原型开发
  2. 可扩展性

    • 支持自定义组件
    • 灵活的架构设计
  3. 社区生态

    • 丰富的第三方集成
    • 活跃的开发者社区

典型工作流程

  1. 初始化语言模型
  2. 配置必要组件(记忆、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框架提供的一种声明式编程语言,专门为构建和组合语言模型应用而设计。它允许开发者通过简洁的表达式语法来定义复杂的工作流,而无需编写大量样板代码。

核心特性

  1. 链式组合:支持将不同组件(如LLM、提示模板、输出解析器等)以链式方式组合

  2. 声明式语法:采用Pythonic的声明式语法,使代码更易读易维护

  3. 自动并行化:能自动识别可以并行执行的组件

  4. 错误处理:内置错误处理和重试机制

  5. 流式支持:原生支持流式输出处理

典型应用场景

# 示例:构建一个简单的问答链
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的管道操作符组合组件

高级功能

  1. 条件分支:支持基于条件执行不同路径
  2. 动态路由:可以根据输入内容动态选择处理路径
  3. 批处理:支持批量处理输入以提高效率
  4. 记忆功能:可与对话记忆系统集成

优势比较

特性传统方式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!