当前位置:首页 > 学习笔记 > 正文内容

LangChain 入门教程:AI 应用开发利器

廖万里24小时前学习笔记1

LangChain 是目前最热门的 AI 应用开发框架,它让开发者能够快速构建基于大语言模型的应用。无论你是想做 RAG 知识库问答、智能对话机器人,还是自动化 Agent,LangChain 都能帮你事半功倍。本文将从零开始,带你掌握 LangChain 的核心概念和实战技巧。

一、核心概念

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它的核心理念是将各种组件"链式"组合,构建复杂的 AI 应用。想象一下,你不需要从零开始写代码调用 API、处理上下文、管理对话历史,LangChain 已经帮你封装好了这一切。

1.1 为什么选择 LangChain?

在大模型时代,开发者面临几个核心挑战:

  • 模型切换困难:从 OpenAI 切换到 Claude,需要改写大量代码
  • 上下文管理繁琐:手动管理对话历史、token 计数让人头大
  • 提示词工程复杂:写一个好的 prompt 需要反复调试
  • 缺乏工具调用能力:模型本身无法联网、无法访问数据库

LangChain 通过模块化设计,优雅地解决了这些问题。它的设计哲学是:组件可替换、链路可组合、扩展性强。

1.2 架构概览

LangChain 的架构可以分为六个核心模块:

┌─────────────────────────────────────────────┐
│                  应用层                      │
│  (Chatbots, QA Systems, Agents)            │
├─────────────────────────────────────────────┤
│                  Chains                     │
│  (组合多个组件形成工作流)                    │
├─────────────────────────────────────────────┤
│    Prompts    │    Memory    │    Agents   │
│  (提示词管理) │ (对话记忆)    │ (智能代理)  │
├─────────────────────────────────────────────┤
│              LLMs / Chat Models             │
│  (OpenAI, Claude, 文心一言等)               │
├─────────────────────────────────────────────┤
│           Document Loaders & Embeddings     │
│  (文档加载、向量化)                         │
└─────────────────────────────────────────────┘

二、核心组件详解

2.1 Model I/O:与模型交互

这是 LangChain 最基础的模块,包含了 LLM(大语言模型)和 Chat Model(聊天模型)两种接口。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

# 初始化聊天模型
# temperature 控制创造性,0 表示最确定性输出
chat = ChatOpenAI(
    model="gpt-4-turbo-preview",
    temperature=0.7,
    api_key="your-api-key"
)

# 构造消息
messages = [
    SystemMessage(content="你是一个专业的 Python 开发工程师"),
    HumanMessage(content="解释一下什么是装饰器?")
]

# 调用模型
response = chat.invoke(messages)
print(response.content)

关键点:ChatOpenAI 的 temperature 参数非常重要。0-0.3 适合事实性任务(如代码生成),0.7-1.0 适合创意性任务(如文案生成)。

2.2 Prompts:提示词工程

LangChain 提供了强大的提示词模板功能,让你的 prompt 可复用、可组合。

from langchain_core.prompts import ChatPromptTemplate

# 基础模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{role},用{style}的语气回答问题"),
    ("user", "{input}")
])

# 格式化模板
formatted = prompt.format(
    role="资深架构师",
    style="专业且幽默",
    input="微服务架构有什么优缺点?"
)

print(formatted)

2.3 Chains:链式调用

Chain 是 LangChain 的核心概念,它将多个组件串联起来,形成一个完整的工作流。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 定义组件
model = ChatOpenAI(model="gpt-4-turbo-preview")
prompt = ChatPromptTemplate.from_template("给{product}起一个{style}的中文名字")
output_parser = StrOutputParser()

# 构建链 - 使用 LCEL (LangChain Expression Language)
chain = prompt | model | output_parser

# 调用链
result = chain.invoke({"product": "AI助手", "style": "科技感"})
print(result)

2.4 Memory:对话记忆

默认情况下,大模型是无状态的,每次调用都是独立的。Memory 让模型能够记住之前的对话内容。

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# 存储对话历史的字典
store = {}

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# 创建带记忆的链
model = ChatOpenAI(model="gpt-4-turbo-preview")
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("placeholder", "{chat_history}"),
    ("user", "{input}")
])

chain = prompt | model

# 包装成带记忆的链
chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history"
)

# 测试多轮对话
chain_with_history.invoke(
    {"input": "我叫小明"},
    config={"configurable": {"session_id": "user-001"}}
)

chain_with_history.invoke(
    {"input": "我叫什么名字?"},
    config={"configurable": {"session_id": "user-001"}}
)

2.5 Agents:智能代理

Agent 是 LangChain 最强大的功能,它能让模型自主决定调用哪些工具。

from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.tools import tool

# 定义工具
@tool
def multiply(a: int, b: int) -> int:
    """乘法运算,计算 a * b"""
    return a * b

@tool
def get_weather(city: str) -> str:
    """查询城市天气"""
    weather_data = {
        "北京": "晴天,温度 15°C",
        "上海": "多云,温度 18°C",
        "深圳": "小雨,温度 22°C"
    }
    return weather_data.get(city, "未找到该城市天气信息")

# 创建 Agent
tools = [multiply, get_weather]
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("placeholder", "{chat_history}"),
    ("user", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 测试 Agent
result = agent_executor.invoke({"input": "北京今天的天气怎么样?"})
print(result["output"])

三、实战案例:构建 RAG 知识库问答系统

RAG(Retrieval Augmented Generation)是目前最流行的 AI 应用模式,它结合了检索和生成。

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

# 第一步:加载文档
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()

# 第二步:文档分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
splits = text_splitter.split_documents(documents)

# 第三步:向量化存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 第四步:创建检索器
retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 4}
)

# 第五步:构建 RAG 链
model = ChatOpenAI(model="gpt-4-turbo-preview")

system_prompt = """你是一个知识库问答助手。
使用以下检索到的上下文来回答问题。
如果不知道答案,就说不知道,不要编造。

上下文:
{context}"""

prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    ("user", "{input}")
])

question_answer_chain = create_stuff_documents_chain(model, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

# 第六步:问答
response = rag_chain.invoke({"input": "公司的年假政策是什么?"})
print(response["answer"])

四、最佳实践与踩坑指南

4.1 性能优化

  • 缓存 Embedding:向量化是耗时的操作,使用 Chroma 或 FAISS 持久化存储
  • 批处理请求:大量文档时,使用批量 embedding 接口
  • 选择合适的模型:简单任务用 gpt-3.5-turbo,复杂推理用 gpt-4

4.2 常见错误

# 设置 API Key
import os
os.environ["OPENAI_API_KEY"] = "sk-xxx"

# temperature 设置建议
# 代码生成:temperature=0
# 创意写作:temperature=0.7-1.0

总结

LangChain 作为 AI 应用开发的首选框架,极大地降低了开发门槛。通过本文的学习,你已经掌握了:

  1. 核心概念:Models、Prompts、Chains、Memory、Agents
  2. LCEL 语法:优雅地组合各个组件
  3. RAG 实战:构建知识库问答系统
  4. 最佳实践:避免常见坑,提升性能

AI 时代已经到来,LangChain 是你通往 AI 应用开发的最佳捷径。开始动手实践吧,从一个小项目开始,逐步深入。记住:纸上得来终觉浅,绝知此事要躬行


相关资源:

  • LangChain 官方文档:https://python.langchain.com
  • LangSmith 调试平台:https://www.langchain.com/langsmith

本文链接:https://www.kkkliao.cn/?id=974 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。