LangChain 10周学习计划(含实战代码模板)

119 阅读11分钟

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)

三、关键注意事项

  1. 配置替换:所有代码模板需替换密钥、文件路径、模型名称为个人实际配置,例如OpenAI密钥需在官网注册获取。
  2. 开源模型使用:Llama2、BgeEmbeddings等开源模型需提前通过Hugging Face Hub下载,或使用国内镜像源加速,部分模型需申请授权。
  3. 向量库配置:Chroma为本地轻量向量库,直接运行即可;Pinecone等云端向量库需注册账号,获取API密钥后配置环境变量。
  4. 依赖问题:若出现版本冲突,可指定依赖版本(如pip install langchain==0.1.10),优先参考LangChain官方文档的版本要求。
  5. 网络问题:调用OpenAI服务需配置科学上网,国内用户可替换为百度文心一言、阿里通义千问等国产大模型的LangChain集成包。
  6. 项目输出:第10周项目需整理至GitHub,包含README.md(说明功能、依赖、启动方式)、代码注释、示例数据,便于求职时展示。

四、补充资源