LangChain入门:从Hello World到实战

前言

最近在学习尚硅谷的LangChain教程,跟着敲了一遍代码,感觉收获挺大的,所以整理了这篇文章分享给大家。

说实话,刚开始接触LangChain的时候还挺懵的,不知道它到底是干嘛的。简单来说,它就是一个帮你快速开发大模型应用的框架。你想做个智能问答、做个聊天机器人、或者搞个知识库检索,用LangChain会方便很多。

这篇文章会从最基础的Hello World开始,一步步带你了解LangChain的核心功能。代码都是实际跑过的,可以直接拿来用。

🏠个人主页:山沐与山的技术空间


文章目录


一、什么是LangChain

LangChain是2022年10月由哈佛大学的Harrison Chase搞出来的一个开源框架,专门用来开发大模型应用的。

要理解LangChain,可以这么类比:

  • LangChain对于大模型,就像Spring对于Java
  • LangChain对于大模型,就像Django/Flask对于Python

简单说就是:Lang代表大语言模型,Chain就是"链"的意思。把大模型和各种外部数据、工具连接起来,组成一条条处理链,这就是LangChain的核心思想。

能做什么

用LangChain可以做很多事:

  • 智能助手:能自己思考、自己决策的AI
  • 问答系统:基于知识库回答问题
  • 聊天机器人:支持多轮对话的那种
  • 文档搜索:在一堆文档里快速找到你要的内容
  • 企业知识库:把公司的文档都喂给AI,随时问随时答

热度如何

GitHub上已经112k+ star了,在大模型开发框架里算是最火的一个,生态也最完善。


二、为什么需要LangChain

问题1:直接调API不行吗?

确实,你可以直接用ChatGPT或者其他模型的API来开发。但问题是,真正的应用开发可没那么简单:

  • 大模型的知识是有时效性的,过时了怎么办?RAG可以解决
  • 模型经常"瞎编",怎么保证回答准确?还是RAG
  • 想让模型联网查资料、调用工具?得用Function Calling
  • 复杂任务需要分步执行?得自己写一堆逻辑

这些问题,LangChain都帮你封装好了。

问题2:用框架有啥好处?

直接对比一下就清楚了:

维度 直接用API 用LangChain
开发难度 自己处理各种调用逻辑 框架帮你封装好了
学习成本 每个模型API都不一样 统一的接口,学一次就行
功能实现 RAG、Agent都得自己写 现成的组件直接用
代码复用 代码写得乱,难维护 模块化设计,好扩展

简单说,LangChain就是让你少写很多重复代码,专注在业务逻辑上。

问题3:LangChain能干什么?

LangChain提供了一整套工具:

  • 提示词管理:模板化管理,支持变量
  • 模型调用:一套代码,调用各种模型
  • 记忆系统:记住对话历史
  • 工具调用:让模型能调API、用工具
  • RAG:文档检索增强生成
  • Agent:能自己思考、自己行动的智能体

三、LangChain核心架构

整体架构

LangChain的架构其实挺清晰的,分三层:

┌─────────────────────────────────────┐
│         LangSmith (监控调试)          │
├─────────────────────────────────────┤
│      LangServe (REST API部署)        │
├─────────────────────────────────────┤
│          LangGraph (编排)            │
├─────────────────────────────────────┤
│           LangChain (核心)           │
│  ┌─────────┬─────────┬─────────┐   │
│  │ Model IO│Retrieval│  Agents │   │
│  ├─────────┼─────────┼─────────┤   │
│  │  Chains │ Memory  │  Tools  │   │
│  └─────────┴─────────┴─────────┘   │
├─────────────────────────────────────┤
│    LangChain-Community (第三方集成)   │
├─────────────────────────────────────┤
│      LangChain-Core (基础抽象)        │
└─────────────────────────────────────┘

六大核心组件

LangChain主要由六个模块组成,下面挑重点讲:

1. Model I/O(模型输入输出)

这个是用得最多的基础模块。

核心流程很简单:输入格式化 → 调用模型 → 解析输出

  • Format:用模板管理输入,可以插变量
  • Predict:统一接口调各种模型
  • Parse:把模型输出转成结构化数据,比如JSON
2. Chains(链式调用)

这是最重要的模块!把多个组件串起来,形成一个完整的处理流程。

举几个常用的:

  • LLMChain:最基础的,把提示词和模型串起来
  • SequentialChain:多个步骤依次执行
  • RouterChain:自动判断该走哪条链
  • RetrievalQA:结合知识库做问答
3. Memory(记忆模块)

让模型能"记住"之前说过的话。

  • 短期记忆:就是单次对话的上下文

    • ChatGPT大概能记8k个token
    • GPT-4能记32k
    • 最新的模型甚至能记100万+(相当于2000万字,基本够用了)
  • 长期记忆:跨多次对话的记忆,有几种实现方式:

    • 微调模型:把知识"烧"进模型参数里
    • 知识图谱:结构化存储
    • 向量数据库:把对话存成向量,需要时检索
4. Agents(智能体)

这个比较高级,能让模型自己决定该用什么工具、怎么执行任务。

核心思想

Agent = 大模型 + 记忆 + 工具 + 规划能力 + 执行能力

主要包括:

  • AgentType:不同类型的决策模式
  • Tool:各种工具,比如搜索、计算器、API调用等
  • AgentExecutor:负责执行Agent的决策
5. Retrieval(检索模块)

就是RAG(检索增强生成)的完整实现,流程是这样的:

  • Source:从各种地方加载数据(PDF、网页、CSV等)
  • Load:把文档加载进来
  • Transform:把长文本切成小块
  • Embed:转成向量(数字表示)
  • Store:存到向量数据库
  • Retrieve:根据问题检索相关内容
6. Callbacks(回调机制)

允许连接到LLM应用的各个阶段,实现:

  • 日志记录
  • 性能监控
  • 流式输出
  • 调试分析

四、开发环境准备

前置要求

开始之前,你需要:

  1. Python基础:至少会写函数、类这些
  2. 大模型基础:知道什么是LLM、Token、Prompt这些概念
  3. API使用经验:最好用过ChatGPT的API

环境安装

步骤1:安装Python环境

建议用Anaconda,方便管理环境:

# 创建虚拟环境
conda create -n langchain-env python=3.10

# 激活环境
conda activate langchain-env

# 验证Python版本
python --version
步骤2:安装LangChain

使用pip安装核心库:

# 安装LangChain核心库
pip install langchain==0.3.27

# 安装OpenAI集成
pip install langchain-openai==0.3.33

# 安装社区扩展
pip install langchain-community==0.3.29

或使用国内镜像加速:

pip install -i https://mirrors.aliyun.com/pypi/simple/ langchain langchain-openai langchain-community
步骤3:配置API密钥

在项目根目录创建.env文件,添加API配置:

OPENAI_API_KEY="sk-your-api-key-here"
OPENAI_BASE_URL="https://api.openai-proxy.org/v1"

密钥获取:可以从OpenAI官网或第三方代理服务(如closeai-asia.com)获取

步骤4:安装开发工具

推荐使用PyCharm或VS Code作为开发环境:

# 验证安装
import langchain
print(langchain.__version__)  # 应输出 0.3.27

import openai
print(openai.__version__)  # 应输出 1.81.0

五、第一个LangChain程序

示例1:基础模型调用

最简单的LangChain程序,直接调用大模型:

import dotenv
from langchain_openai import ChatOpenAI
import os

# 加载环境变量
dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")

# 创建大模型实例
llm = ChatOpenAI(model="gpt-4o-mini")

# 调用模型
response = llm.invoke("什么是大模型?")
print(response.content)

输出结果

大模型(Large Model)通常指的是具有大量参数且在训练过程中需要大量计算资源的机器学习模型。
大模型的特点包括参数规模大、数据需求高、计算资源消耗大,在自然语言处理、计算机视觉等领域
得到广泛应用。

示例2:使用提示词模板

引入变量,让提示词更加灵活:

from langchain_core.prompts import ChatPromptTemplate

# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是世界级的技术文档编写者"),
    ("user", "{input}")  # {input}为变量
])

# 创建调用链
chain = prompt | llm

# 使用管道符 | 连接组件
message = chain.invoke({"input": "大模型中的LangChain是什么?"})
print(message.content)

关键点

  • 使用ChatPromptTemplate.from_messages()构建提示词
  • 支持systemuser两种角色
  • 使用{变量名}进行变量占位
  • 使用|管道符连接多个组件

示例3:使用输出解析器

将模型输出解析为结构化数据:

from langchain_core.output_parsers import JsonOutputParser

# 创建JSON解析器
output_parser = JsonOutputParser()

# 更新提示词,要求JSON格式输出
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是世界级的技术文档编写者"),
    ("user", "{input}")
])

# 创建完整的链
chain = prompt | llm | output_parser

# 调用并获取结构化输出
result = chain.invoke({
    "input": "LangChain是什么? 用JSON格式回复,问题用question,回答用answer"
})

print(result)

输出结果

{
    'question': 'LangChain是什么?',
    'answer': 'LangChain是一个开源框架,用于构建基于大语言模型的应用程序...'
}

示例4:使用向量存储(RAG基础)

实现简单的知识库检索:

from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
import bs4

# 1. 加载网页内容
loader = WebBaseLoader(
    web_path="https://www.gov.cn/xinwen/2020-06/01/content_5516649.htm",
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)
docs = loader.load()

# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
documents = text_splitter.split_documents(docs)
print(f"文档被分割成 {len(documents)} 个片段")

# 3. 向量化并存储
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
vector = FAISS.from_documents(documents, embeddings)

# 4. 检索相关内容
retriever = vector.as_retriever(search_kwargs={"k": 3})
docs = retriever.invoke("建设用地使用权是什么?")

print(f"检索到 {len(docs)} 条相关内容")

核心流程

  1. 文档加载:从各种数据源加载内容
  2. 文本分块:将长文本切分为小片段
  3. 向量化:使用Embedding模型转换为向量
  4. 存储检索:存入向量数据库并进行相似度搜索

示例5:构建RAG问答系统

基于检索结果生成答案:

from langchain_core.prompts import PromptTemplate

# 定义RAG提示词模板
prompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。

已知信息:
{info}

用户问:
{question}

请用中文回答用户问题。
"""

# 创建提示词对象
template = PromptTemplate.from_template(prompt_template)
prompt = template.format(info=docs, question='建设用地使用权是什么?')

# 调用LLM生成答案
response = llm.invoke(prompt)
print(response.content)

输出结果

建设用地使用权是指在法律规定的范围内,建设用地使用权人对特定土地的使用、建造建筑物
及其他设施的权利。根据相关法律规定,建设用地使用权可以通过出让或划拨等方式设立,
并应当符合资源节约、生态环境保护及土地用途的规定。建设用地使用权人有权转让、出资、
赠与或抵押其使用权,但需遵循法律规定和合同约定。

示例6:使用Agent(智能体)

让AI自主决策何时调用工具:

from langchain.tools.retriever import create_retriever_tool
from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor

# 1. 创建检索工具
retriever_tool = create_retriever_tool(
    retriever,
    "CivilCodeRetriever",
    "搜索有关中华人民共和国民法典的信息。关于民法典的任何问题,必须使用此工具!"
)

tools = [retriever_tool]

# 2. 从Hub加载Agent提示词
prompt = hub.pull("hwchase17/openai-functions-agent")

# 3. 创建Agent
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 4. 运行Agent
result = agent_executor.invoke({"input": "建设用地使用权是什么"})
print(result['output'])

执行过程(verbose=True显示思考过程):

> Entering new AgentExecutor chain...

Invoking: `CivilCodeRetriever` with `{'query': '建设用地使用权'}`

[检索到相关法律条文...]

建设用地使用权是指在中华人民共和国法律框架下,个人或单位依法享有的对特定建设用地
进行开发、建设和利用的权利。主要包括:
1. 设立与形式:可以通过出让或划拨方式设立
2. 合同与登记:需要书面合同并向登记机构申请登记
3. 权利与义务:有权合理利用土地,但需遵守用途规定
4. 转让与变更:可以进行转让、互换、出资、赠与或抵押
5. 期满续期:住宅用地到期自动续期

> Finished chain.

Agent的优势

  • 自主判断是否需要调用工具
  • 可以多次调用工具直到获得答案
  • 支持复杂的推理和决策流程
  • 真正实现了"智能体"的概念

六、常见问题与注意事项

问题1:API密钥配置

问题 解决方案
.env文件不生效 确保文件在项目根目录,使用dotenv.load_dotenv()加载
API调用超时 检查OPENAI_BASE_URL是否正确,尝试更换代理地址
密钥无效错误 验证密钥是否正确,是否有足够的配额

问题2:包安装问题

# 如果遇到依赖冲突
pip install --upgrade pip

# 使用conda和pip混合安装时的建议顺序
conda install numpy pandas  # 先装基础包
pip install langchain langchain-openai  # 再装专用包

问题3:版本兼容性

LangChain v0.2相较于v0.1修改了10%-15%的API,主要变化:

  • 更稳定的接口设计
  • 更好的安全性
  • 支持更多大模型平台

建议:使用最新的v0.3版本,API更加稳定。

问题4:Token消耗优化

优化方向 具体方法
减少输入Token 精简提示词,移除无用信息
控制输出长度 使用max_tokens参数限制输出
使用更小模型 简单任务使用gpt-4o-mini而非gpt-4
缓存重复请求 对相同问题使用缓存机制

问题5:RAG检索效果差

常见原因和解决方案:

  1. 分块不合理chunk_size设置过大或过小
    • 建议:500-1000字符,overlap设置为10%-20%
  2. 检索数量不足k值设置过小
    • 建议:返回3-5条相关内容
  3. Embedding模型不匹配:使用的模型不适合中文
    • 建议:使用支持中文的模型如text-embedding-ada-002

七、总结

这篇文章把LangChain的基础内容都过了一遍,主要包括:

核心内容回顾

  1. LangChain是什么:一个大模型应用开发框架,帮你少写很多代码

  2. 六个核心模块

    • Model I/O:处理模型输入输出
    • Chains:把多个步骤串起来
    • Memory:让模型记住对话历史
    • Agents:能自己思考、自己行动
    • Retrieval:RAG检索
    • Callbacks:监控调试
  3. 学习路线:先Hello World,再提示词模板,然后输出解析,接着RAG,最后Agent

  4. 两种常见应用

    • RAG应用:解决知识过时和瞎编问题
    • Agent应用:让AI自己决策、自己用工具

给点建议

学LangChain最好的方法就是做项目。可以从简单的开始:

  • 先做个文档问答(练RAG)
  • 再做个日程助手(练Agent)
  • 最后做个企业知识库(综合应用)

别光看不练,代码敲起来才有感觉。

接下来

基础会了之后,可以深入研究:

  1. 提示词工程怎么写得更好
  2. LCEL语法怎么玩
  3. Memory怎么管理长对话
  4. RAG怎么做得更准确
  5. Agent怎么让它更智能

热门专栏推荐

等等等还有许多优秀的合集在主页等着大家的光顾,感谢大家的支持

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😊
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🙏
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🌟

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐