LangChain 10周学习计划(含实战代码模板)
适配岗位:AI大模型应用开发工程师(30K+)
一、学习周期与整体框架
| 阶段 | 核心内容 | 目标 |
|---|---|---|
| 第0周 | 前置基础 | 补齐Python/大模型/工具配置 |
| 第1-2周 | LangChain基础+Chat模型 | 掌握LLM调用、基础Chain与会话记忆 |
| 第3-4周 | Tools&Agent+Embedding/向量库 | 实现工具调用、智能体、文本向量化存储 |
| 第5-6周 | RAG专题+自定义组件 | 构建完整RAG链路并优化 |
| 第7-8周 | 案例实战 | 落地知识库、Chatbot等实际项目 |
| 第9-10周 | LangGraph+项目整合 | 搭建多智能体系统与完整办公助手项目 |
二、每周详细计划与代码模板
第0周:前置准备
目标
- Python基础:函数、类、异步编程、
pydantic - 大模型基础:LLM调用逻辑、Prompt工程
- 工具配置:Anaconda、Git、VS Code
通用依赖安装
# 核心依赖
pip install langchain langchain-openai langchain-community langchain-core
# 扩展依赖(向量库/文档加载/可视化等)
pip install chromadb pinecone-client pypdf beautifulsoup4 gradio streamlit langgraph
# 开源模型相关(可选)
pip install transformers accelerate sentence-transformers
代码模板:基础环境测试
# 1. 异步环境测试
import asyncio
async def async_test():
await asyncio.sleep(1)
print("异步环境正常")
asyncio.run(async_test())
# 2. 大模型密钥配置(以OpenAI为例)
import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI密钥"
# 开源模型无需密钥,需提前下载模型(如Llama2)
第1周:LangChain基础+Chat模型
目标
- 理论:LangChain定位、Chains/Prompts/Models
- 实战:安装LangChain、基础LLM调用、LLMChain
代码模板
# 1. 基础LLM调用
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
response = llm.invoke("解释一下LangChain的核心作用")
print(response.content)
# 2. 基础LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
prompt = PromptTemplate(
template="请用{style}风格解释{topic}",
input_variables=["style", "topic"]
)
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.invoke({"style": "通俗易懂", "topic": "LLMChain"})
print(result["text"])
第2周:Chat模型进阶
目标
- 理论:会话记忆(Memory)、消息格式(
HumanMessage/AIMessage) - 实战:ConversationBufferMemory、对接Llama2
代码模板
# 1. 带记忆的对话
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True # 打印Chain执行日志
)
# 多轮对话
conversation.invoke({"input": "我叫小明,想学LangChain"})
conversation.invoke({"input": "还记得我叫什么吗?"})
# 2. 对接开源模型(Llama2为例)
from langchain_community.chat_models import ChatHuggingFace
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
chat_model = ChatHuggingFace(pipeline=pipe)
response = chat_model.invoke("LangChain和Llama2结合的优势")
print(response.content)
第3周:Tools & Agent
目标
- 理论:Tools类型、Agent逻辑(React)
- 实战:天气工具、计算器工具、AgentExecutor
代码模板
# 1. 自定义工具
from langchain.tools import BaseTool, StructuredTool, tool
from typing import Optional
# 方式1:装饰器定义工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气(模拟)"""
return f"{city}今天天气晴朗,温度25℃"
# 方式2:类定义工具
class CalculatorTool(BaseTool):
name = "calculator"
description = "用于计算数学表达式,输入为字符串格式的表达式"
def _run(self, expression: str) -> str:
try:
result = eval(expression)
return f"计算结果:{result}"
except:
return "计算失败,请检查表达式"
# 2. Agent调用工具
from langchain.agents import AgentExecutor, create_react_agent
from langchain.prompts import PromptTemplate
from langchain_core.tools import Tool
# 工具列表
tools = [
Tool(name="WeatherTool", func=get_weather, description="获取城市天气"),
CalculatorTool()
]
# React Agent Prompt
react_prompt = PromptTemplate.from_template("""
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original question
Begin!
Question: {input}
Thought: {agent_scratchpad}
""")
# 创建Agent
agent = create_react_agent(llm, tools, react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 测试Agent
agent_executor.invoke({"input": "北京今天天气怎么样?计算100+200的结果"})
第4周:Embedding & 向量库
目标
- 理论:Embedding原理、向量库检索逻辑
- 实战:OpenAIEmbeddings、Chroma存储与检索
代码模板
# 1. 生成Embedding
from langchain_openai import OpenAIEmbeddings
# 开源Embedding(可选)
# from langchain_community.embeddings import BgeEmbeddings
embeddings = OpenAIEmbeddings()
text = "LangChain是LLM应用开发框架"
vector = embeddings.embed_query(text)
print(f"向量维度:{len(vector)}")
# 2. 对接Chroma向量库
from langchain_community.vectorstores import Chroma
# 批量文本嵌入+存储
texts = [
"LangChain支持LLM调用",
"LangChain提供Tools和Agent功能",
"LangChain可对接向量库实现RAG"
]
db = Chroma.from_texts(texts, embeddings, persist_directory="./chroma_db")
db.persist()
# 相似性检索
query = "LangChain有哪些核心功能?"
docs = db.similarity_search(query, k=2)
print("检索结果:")
for doc in docs:
print(doc.page_content)
第5周:RAG核心流程
目标
- 理论:RAG流程(加载→分片→嵌入→检索→生成)
- 实战:PDF加载、文本分片、RetrievalQA
代码模板
# 1. 文档加载+分片
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载PDF(替换为你的PDF路径)
loader = PyPDFLoader("langchain_docs.pdf")
documents = loader.load()
# 文本分片
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 分片大小
chunk_overlap=50 # 分片重叠
)
splits = text_splitter.split_documents(documents)
# 2. 构建RAG检索链
from langchain.chains import RetrievalQA
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# 构建向量库
db = Chroma.from_documents(splits, embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})
# 基础RAG链
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 直接拼接检索结果
retriever=retriever,
verbose=True
)
# 测试RAG
result = rag_chain.invoke({"query": "LangChain的核心功能有哪些?(基于文档回答)"})
print(result["result"])
第6周:RAG优化+自定义组件
目标
- 理论:上下文压缩、组件扩展
- 实战:ContextualCompressionRetriever、自定义JSON解析器
代码模板
# 1. RAG优化(上下文压缩)
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
# 复用第5周的retriever和llm
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
# 优化后的RAG
optimized_rag = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=compression_retriever
)
# 2. 自定义OutputParser
from langchain_core.output_parsers import BaseOutputParser
from typing import List
from langchain.prompts import PromptTemplate
class JSONOutputParser(BaseOutputParser):
def parse(self, text: str) -> dict:
import json
# 清理LLM输出中的非JSON内容
text = text.strip().replace("```json", "").replace("```", "")
return json.loads(text)
# 测试自定义Parser
prompt = PromptTemplate(
template="将以下文本转为JSON格式:{text}\n输出仅包含JSON,无需其他内容",
input_variables=["text"]
)
chain = prompt | llm | JSONOutputParser()
result = chain.invoke({"text": "姓名:小明,年龄:25,学习方向:LangChain"})
print(f"结构化输出:{result},类型:{type(result)}")
第7周:案例实战(AI代码助手)
目标
- 实战:Python代码执行工具、函数调用Agent
代码模板
# AI代码助手(集成Python代码执行工具)
from langchain_community.tools import PythonAstREPLTool
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 代码执行工具
python_tool = PythonAstREPLTool()
tools = [python_tool]
# 函数调用Prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是AI代码助手,可执行Python代码解答问题,确保代码正确可运行"),
("user", "{input}"),
("placeholder", "{agent_scratchpad}")
])
# 创建函数调用Agent
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 测试:计算1到100的和(用代码实现)
agent_executor.invoke({"input": "用Python代码计算1到100的累加和,并输出结果"})
第8周:RAG Chatbot(Gradio可视化)
目标
- 实战:Gradio界面、ChatInterface集成RAG
代码模板
import gradio as gr
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# 初始化RAG链(复用第5/6周的逻辑)
llm = ChatOpenAI(model="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
def rag_chatbot(message, history):
"""Gradio交互函数"""
result = rag_chain.invoke({"query": message})
return result["result"]
# 搭建Gradio界面
demo = gr.ChatInterface(
fn=rag_chatbot,
title="LangChain RAG问答助手",
description="上传文档后可基于文档问答(当前已加载LangChain文档)",
# 可选:添加文件上传组件,动态加载文档
# additional_inputs=[gr.File(label="上传PDF文档", type="filepath")]
)
# 启动界面(本地访问http://localhost:7860)
demo.launch(server_name="0.0.0.0", server_port=7860)
第9周:LangGraph进阶(多Agent协作)
目标
- 理论:LangGraph图结构(Nodes/Edges/State)、多智能体协作
- 实战:研究员+写作者多Agent系统
代码模板
from langgraph.graph import StateGraph, END
from langchain_core.messages import HumanMessage
from typing import TypedDict, List
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 初始化基础组件
llm = ChatOpenAI(model="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})
rag_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
# 定义状态:存储对话消息和最终报告
class AgentState(TypedDict):
messages: List[HumanMessage]
report: str # 最终报告
# 定义节点1:研究员(负责检索信息)
def researcher_agent(state):
"""研究员:基于问题检索相关信息"""
query = state["messages"][-1].content # 获取最新问题
research_result = rag_chain.invoke({"query": query})["result"]
return {"messages": state["messages"], "report": research_result}
# 定义节点2:写作者(负责整理报告)
def writer_agent(state):
"""写作者:将检索结果整理为结构化报告"""
research_result = state["report"]
prompt = f"请将以下内容整理为逻辑清晰、格式规范的结构化报告,包含核心观点和分点说明:\n{research_result}"
report = llm.invoke(prompt).content
return {"messages": state["messages"], "report": report}
# 构建图结构
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("researcher", researcher_agent) # 研究员节点
graph.add_node("writer", writer_agent) # 写作者节点
# 定义边:流程走向
graph.add_edge("researcher", "writer") # 研究员的输出作为写作者的输入
graph.add_edge("writer", END) # 写作者完成后流程结束
# 设置入口节点
graph.set_entry_point("researcher")
# 编译图
app = graph.compile()
# 运行多Agent系统
result = app.invoke({
"messages": [HumanMessage(content="LangChain在RAG中的应用场景有哪些?请结合实际案例说明")],
"report": "" # 初始报告为空
})
print("最终结构化报告:\n", result["report"])
第10周:项目整合(AI办公助手)
目标
- 实战:RAG+Agent+LangGraph+Gradio整合
- 输出:GitHub项目代码+技术文档
代码模板(核心逻辑)
import gradio as gr
from langchain.agents import create_react_agent, AgentExecutor
from langchain.prompts import PromptTemplate
from langchain_core.tools import Tool
from langchain_community.tools import PythonAstREPLTool
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 1. 初始化核心组件
llm = ChatOpenAI(model="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})
rag_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
# 2. 定义工具集(整合RAG、计算器、代码执行)
# 工具1:RAG文档问答工具
def rag_tool(query: str) -> str:
"""用于回答文档相关问题,输入为自然语言查询"""
return rag_chain.invoke({"query": query})["result"]
# 工具2:计算器工具
class CalculatorTool(BaseTool):
name = "calculator"
description = "用于计算数学表达式,输入为字符串格式的数学表达式(如'1+2*3')"
def _run(self, expression: str) -> str:
try:
result = eval(expression)
return f"计算成功,结果为:{result}"
except Exception as e:
return f"计算失败,错误原因:{str(e)},请检查表达式格式"
# 工具3:Python代码执行工具
python_tool = PythonAstREPLTool(description="用于执行Python代码,可完成数据处理、绘图等任务")
# 工具列表整合
tools = [
Tool(name="文档问答工具", func=rag_tool, description=rag_tool.__doc__),
CalculatorTool(),
python_tool
]
# 3. 构建Agent(统一调度工具)
# React Prompt模板
react_prompt = PromptTemplate.from_template("""
你是专业的AI办公助手,需要根据用户问题选择合适的工具完成任务。你拥有以下工具:
{tools}
使用以下严格格式完成任务:
Question: 用户的输入问题
Thought: 分析问题,判断是否需要调用工具,调用哪个工具,以及工具的输入参数
Action: 工具名称,必须是[{tool_names}]中的一个
Action Input: 工具的输入内容(需符合工具要求的格式)
Observation: 工具的返回结果
...(可重复Thought→Action→Action Input→Observation步骤)
Thought: 已获取足够信息,无需继续调用工具
Final Answer: 整理后的最终答案,语言简洁清晰,符合用户需求
注意:如果不需要调用工具,直接输出Final Answer。
Begin!
Question: {input}
Thought: {agent_scratchpad}
""")
# 创建Agent
agent = create_react_agent(llm=llm, tools=tools, prompt=react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# 4. 封装Gradio可视化界面
def office_assistant(message, history):
"""办公助手交互函数"""
try:
result = agent_executor.invoke({"input": message})
return result["output"]
except Exception as e:
return f"服务异常:{str(e)}"
# 搭建界面
with gr.Blocks(title="AI办公助手") as demo:
gr.Markdown("# AI智能办公助手")
gr.Markdown("支持文档问答、数学计算、Python代码执行等办公场景")
chatbot = gr.Chatbot(label="对话窗口")
msg = gr.Textbox(label="输入问题")
clear = gr.Button("清空对话")
# 绑定交互事件
msg.submit(office_assistant, [msg, chatbot], [chatbot])
clear.click(lambda: None, None, chatbot, queue=False)
# 启动服务
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)
三、关键注意事项
- 配置替换:所有代码模板需替换
密钥、文件路径、模型名称为个人实际配置,例如OpenAI密钥需在官网注册获取。 - 开源模型使用:Llama2、BgeEmbeddings等开源模型需提前通过Hugging Face Hub下载,或使用国内镜像源加速,部分模型需申请授权。
- 向量库配置:Chroma为本地轻量向量库,直接运行即可;Pinecone等云端向量库需注册账号,获取API密钥后配置环境变量。
- 依赖问题:若出现版本冲突,可指定依赖版本(如
pip install langchain==0.1.10),优先参考LangChain官方文档的版本要求。 - 网络问题:调用OpenAI服务需配置科学上网,国内用户可替换为百度文心一言、阿里通义千问等国产大模型的LangChain集成包。
- 项目输出:第10周项目需整理至GitHub,包含
README.md(说明功能、依赖、启动方式)、代码注释、示例数据,便于求职时展示。
四、补充资源
- LangChain官方文档:python.langchain.com/docs/get_st…
- Hugging Face模型库:huggingface.co/models
- Gradio官方示例:www.gradio.app/examples
- 面试常见问题:RAG优化方案、Agent原理、LangChain组件设计思路