[Ai Agent] 04 一文吃透LangChain:Prompt、LLM、Chain、Memory 全流程实战

博客配套代码发布于github04 LangChain基础

相关Agent专栏:Ai Agent教学

本系列所有博客均配套Gihub开源代码,开箱即用,仅需配置API_KEY。

如果该Agent教学系列帮到了你,欢迎给我个Star⭐,非常感谢!

知识点LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习


前言:

经过基础篇--前三章的学习后,我们已经能靠自己造轮子 来搭建agent。但很明显这样存在这样那样的问题:比如封装方式不统一,接口五花八门,健壮性差...等等。这时,Langchain就登场了。在Langchain里它帮我们干完了造轮子 的活,并统一接口提高代码的复用性等。

它就是眼下最知名的的agent框架,在我们以后构建各种智能体会非常频繁的见到它。了解并学会使用这个框架非常重要。

一、了解Langchain

LangChain:Language Chain 语言链

是的,LangChain作为一个模块,它的其中一个核心就是链:把不同的重要模块用链连接起来,作为一个统一的接口一起输出。

而LangChain作为一个非常庞大,内容量极其丰富的框架。想把里面知识点与文档全部啃完确实有点不太现实。所以本文会着重于最重要的知识点,一切讲解均以做出一个基于Langchain的智能体为目标,帮助读者尽快了解并学会使用Langchain 。如果想要更深入的了解Langchain,推荐访问官方文档:docs.langchain.com/oss/python/... ,做进一步的学习。

二、六大核心模块概述

LangChain 的很多核心模块,其实我们在前三章就已经接触过了。现在的它们只不过是"换了个马甲",把这层包装剥掉,你会发现:

底下的东西,还是你熟悉的老朋友。

下面我们逐一看清它们的"真面目"。


1. Models:就是 LLM,只是更规范了

  • 它就是我们之前直接调用的大模型(如 GPT、通义千问)。

  • 调用方式几乎一致,主要变化是:

    • 导入路径变了(from langchain_openai import ChatOpenAI
    • 接口更统一(所有模型都支持 .invoke()
  • 本质没变:输入消息 → 返回回复。

📌 小结:Models 是"标准化的 LLM 调用方式"


2. Prompt:名字没变,能力升级了

  • 名字还是 PromptTemplate,用法也基本一样。

  • 变化在于:

    • 支持更多格式(如 ChatPromptTemplate 适配对话模型)
    • 可以直接与 Messages 集成
    • 和 Chain 无缝组合
  • 它不再是字符串拼接工具,而是"可执行的模板"

📌 小结:Prompt 是"会说话的输入"


3. Chain:新概念,但思想很老

  • 表面作用:把 Prompt、LLM、Parser 等模块"串起来"形成流水线。

  • 真正核心统一接口,实现"可组合编程"

    • 所有模块都实现 .invoke().stream() 等方法
    • | 操作符自由连接,像搭积木一样构建应用
  • 它是 LangChain 的 核心设计思想 :一切皆为 Runnable

📌 小结:Chain 不是"功能",而是"通信协议"------让 AI 组件能"即插即用"


4. Memory:记忆的"工业级"版本

  • 功能还是"记住上下文",但不再靠手动 messages.append({})

  • LangChain 提供了:

    • 标准化的记忆管理(如 ConversationBufferMemory
    • 自动注入 prompt
    • 支持长期记忆、摘要、向量记忆等高级模式
  • 使用方式从"脚本式"变为"声明式"。

📌 小结:Memory 是"可插拔的记忆系统"


5. Agents:Function Calling 的"自动挡"

  • 本质就是我们之前写的 Function Calling ------ 让 AI 调用外部工具。

  • 但我们自己写时:

    • 要手动判断调用哪个函数
    • 手动解析参数
    • 控制流程
    • 容错困难
  • LangChain 的 Agents:

    • 把这些重复工作全封装了
    • 引入 ReAct 框架(Thought → Action → Observation)
    • 支持多步推理、自动循环、错误恢复
    • 成为一个"自主决策系统"

🎯 所以:

Agents 是 LangChain 最复杂的模块 ,也是最接近"智能体"概念的部分

📌 小结:Agents 是"会自己做决定的 AI"------从"程序员控制"到"AI 自主决策"

⚠️ 因其复杂度高,我们将放在《LangChain 进阶》篇详细讲解。


6. RAG:让 AI "查着资料答题"

  • 一句话理解:AI 在回答前,先从你的资料库中"找答案",然后"看着找到的内容"来回答,确保不瞎编。

  • 技术上:

    • 把文档切片 → 向量化 → 存入向量数据库
    • 用户提问时,检索最相关的文本片段
    • 拼入 prompt,让 LLM 基于此生成回答
  • 它不是简单的"导入文件",而是一套语义检索 + 上下文增强的系统。

📌 小结:RAG 是"开卷考试"模式,让 AI 基于你的数据回答问题

⚠️ RAG 涉及向量检索、chunk 策略、rerank 等细节,复杂度不亚于 Agents,我们将单独开篇详解。

以上就是Langchain的六大核心模块。把这六大核心模块啃下来就能算基本掌握Langchain这个框架了。

其中Models、Prompt、Chain、Memory相对知识点较少,会一并在本文中讲解完毕。

而Agents较为复杂,会放在下篇 Langchain进阶 中再做讲解。

Rag则需要我们单独另开新篇,它的知识点与具体使用方法细节等同样需要好好唠一唠,其复杂程度完全不输Agents。

三、Models(模型)

代码实现:

ini 复制代码
from langchain_openai import ChatOpenAI

# 初始化模型
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=api_key,
    base_url="https://api.deepseek.com"
)

# 调用模型
response = llm.invoke('你好喵')
print(response.content)

📌 说明

  • llm 是一个"可调用对象"(Runnable)
  • .invoke() 是 LangChain 的统一接口

Langchain的价值:把不同厂商的LLM调用接口合并为.invoke(),方便后续组合。

四、Prompt(提示词)

代码实现:

ini 复制代码
from langchain_core.prompts import ChatPromptTemplate

# 定义提示词模板(推荐写法)
prompt = ChatPromptTemplate.from_messages([
        ("system","你是一个猫娘,说完话后面都会带个喵"),
        ("human","{input}") # {query}:占位符
])
# 格式化输出
formatted_prompt = prompt.invoke({"input":"你好呀"})
print(formatted_prompt)

📌 说明

  • ChatPromptTemplate.from_messages最通用、最推荐的写法
  • 支持 systemhumanai 角色
  • {query} 是变量,后续可被 Chain 自动填充
  • 返回的是 PromptValue,可直接传给 LLM

注意:此处prompt.invoke返回的并非是答案。

实际上,这里的作用可以理解为是把提示词写完。仅仅是写完,如果想使用该提示词,得再接入给llm。所以这里返回的答案自然也不会是ai的回复:

五、Chain(链)

逻辑构思:

这里的Chain就需要我们分为好几步,依次按照之前我们讲的模块顺序输出即可。

定义提示词模板

ini 复制代码
prompt = ChatPromptTemplate.from_messages([
    ("system", "你非常可爱,说话末尾会带个喵"),
    ("human", "{input}")  # {input}:占位符
])

初始化模型

ini 复制代码
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=api_key,
    base_url="https://api.deepseek.com"
)

定义解析器

ini 复制代码
parser = StrOutputParser()

这里解析器要稍微讲解下:

LLM返回格式一般是像我们之前所见的AIMessage[{xx}]..之类的看起来非常繁琐的格式。 parser这里确定好解析器,相当于直接对其.content,拿到其中最重要的东西。并指定一个想最终输出的格式类型。比如这里要求的是StrOutputParser,输出的就是Str类。
4.

组成chain并输出

ini 复制代码
# 组成Chain
chain = prompt|llm|parser

# 最终调用
result = chain.invoke({"input":"你好喵"})
print(result)

注:此处的chain内的|顺序不能调换,里面格式必须固定!

输出结果:

看起来是不是非常一目了然?顺序也十分优雅,从前到后依次排列完毕,这就是Chain的妙用。

六、Memory(记忆)

有了Chain的思路,这里你估计也能猜到我们打算怎么做了,上篇Chain的流程几乎不变,只需要再为其增加个 | Memory模块即可...吗?并非

再看看这个chain:它的确能=llm|prompt|parser,但在memory这里可不适用。

chain的动作是线性的 :prompt给ai写问题 ,llm让ai回答 ,parser确定输出格式。

而Memory的逻辑则不同,它是要独立出去,作为一种状态存在,持续记录上下文。

所以我们写法就得与chain独立开来:

ini 复制代码
# ...
prompt = ChatPromptTemplate.from_messages([
    ("system", "你非常可爱,说话末尾会带个喵"),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{input}")  # {input}:占位符
])
# ...

这里注意下:

prompt的写法明显不一样了,我们在system与human的中间新增了个MessagePlacehoolder,叫做history的占位符。它的作用就是在其中加入以往的历史对话,让它拥有记忆的功能。

其他地方llm,parser等跟之前一样:

ini 复制代码
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=api_key,
    base_url="https://api.deepseek.com"
)
parser = StrOutputParser()

chain = prompt | llm | parser

再者,我们需要存储对应的会话历史,需要专门写个函数存储,同时还希望这个会话能隔离不同用户对话记录:

python 复制代码
# 存储所有会话历史(可用数据库替换)
# 此处用字典模拟,也可替换成Redis、SQL等
store = {}

def get_session_history(session_id:str):
    """根据session_id获取该用户的聊天历史"""
    if session_id not in store:
        store[session_id] = ChatMessageHistory() # 创建新的历史记录
    return store[session_id]

这里store可以自主改成某个数据库链接。get_session_histroy是目前较基础的记录聊天历史功能。后续你想扩展比如长期存储,或者对接数据库存储,都可以再做延伸。

最后我们将其包装成一个带记忆的Runnable:

ini 复制代码
# 包装成带记忆的Runnable
runnable_with_memory = RunnableWithMessageHistory(
    runnable=chain,
    get_session_history=get_session_history,
    input_messages_key="input",
    history_messages_key="history"
)

runnbale:我们之前做好的chain(链);

get_session_history:获取历史聊天记录的函数;

input_messages_key:当初用户提问的占位符;

history_messages_key:当初提示词中间的聊天历史记录占位符。

全部写完后我们就可以来个while 1函数测试下是否成功:

假设好某个用户的session_id:

ini 复制代码
session_id = 'user_123'
while 1:
    user_input = input("\n你:")
    if user_input=="quit":
        print('拜拜喵!')
        break
    response = runnable_with_memory.invoke(
        {"input":user_input},
        config={"configurable":{"session_id":session_id}}
    )
    print(f'AI:{response}')

测试成功。

七、Agent实战

我们已经完全掌握了以上这些知识点:Models、Prompt、Chain、Memory

此时我们的工具已经齐全,趁热打铁,赶紧来试试用Langchain自主搭建一个Agent

假设:有固定人设、能记住用户对话内容、可以多轮对话、不调用工具与查阅资料、基于Langchain框架完成的Agent

读者可以试试自己来完成上述要求,完成后或者有所阻碍再参照下方代码修改一下。

以下是完成对应要求的Agent代码:(将llm与prompt作为参数,重复功能封装了下)

ini 复制代码
def create_bot(llm,sys_prompt):
    """
    :param sys_prompt: 系统提示词
    :param llm: 已配置好的语言模型实例
    :return:
    """
    prompt = ChatPromptTemplate.from_messages([
        ("system",sys_prompt),
        MessagesPlaceholder(variable_name="history"),
        ("human","{input}")
    ])
    parser = StrOutputParser()
    chain = prompt | llm | parser
    store = {}

    def get_session_history(session_id):
        return store.setdefault(session_id,ChatMessageHistory())

    return RunnableWithMessageHistory(
        runnable=chain,
        get_session_history=get_session_history,
        input_messages_key="input",
        history_messages_key="history"
    )

def main():
    # 此处集中配置LLM
    llm = ChatOpenAI(
        model="deepseek-chat",
        api_key=create_client(),
        base_url="https://api.deepseek.com"
    )
    prompt = """你是'小智',一位专业、耐心且记忆力出色的 AI 助手。
    你善于倾听,能记住用户之前提到的信息,并在后续对话中自然提及。
    回答时简洁明了,避免冗余。"""
    bot = create_bot(llm,prompt)
    session_id = '123'
    while 1:
        user_input = input('\n你:')
        if user_input == "quit":
            print('拜拜')
            break
        response = bot.invoke({"input":user_input},config={"configurable":{"session_id":session_id}})
        print("AI:",response)


if __name__ == '__main__':
    main()

成功。它的确拥有了记忆。

但...似乎它有点傻?今天咋会是2023年。这就是它不能联网的弊端了。

所以在下篇文章的Langchain进阶中,我们会继续为它加入至关重要的Agents模块 ,为其赋予调用外部工具函数的功能,让它真正变得智能起来。

八、总结

知识点概括LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习

怎么样,把Langchain拆分成这六个模块逐个击破后,是不是立刻就感觉清晰明了了?基础的四大模块我们已经啃掉了,后面的Agents模块和Rag模块也是俩硬骨头。但别怕,我们慢慢啃,啃掉一块是一块。

下篇内容我们会开始学习Langchain的进阶部分。主要开始对Agents的学习与理解。同时还会涉及Langchain的一些高阶用法,让Agent更聪明。

📌 项目代码 + 后续案例合集 全部发布在 Github 仓库 agent-craft ,持续更新中,欢迎Star⭐!

相关推荐
绝无仅有5 小时前
某短视频大厂的真实面试解析与总结(一)
后端·面试·github
绝无仅有6 小时前
腾讯MySQL面试深度解析:索引、事务与高可用实践 (二)
后端·面试·github
徐同保19 小时前
Arguments: ls-remote --tags --heads git://github.com/adobe-webplatform/eve.git
git·adobe·github
CoderJia程序员甲19 小时前
GitHub 热榜项目 - 日榜(2025-10-27)
ai·开源·大模型·github·ai教程
北塔软件20 小时前
各品牌服务器IPMI配置实战经验分享
服务器·git·github
德莱厄斯21 小时前
没开玩笑,全框架支持的 dialog 组件,支持响应式
前端·javascript·github
逛逛GitHub1 天前
100+ 热门网站克隆版:这个 3 万星的 GitHub 项目顶啊。
github
阿部多瑞 ABU1 天前
# AI高精度提示词生成项目——3D-VR 课件—— 最终仓库级 AI 提示词:生成《EduVR Studio》—— 专业级 3D-VR 课件创作平台
gitee·开源·github·aigc·ai编程·1024程序员节
hweiyu001 天前
Gradle 与 CI/CD 集成:Jenkins/GitHub Actions 自动化构建配置
ci/cd·github·jenkins·gradle