LangChain基础实战手记:如何给大模型装上“大脑(记忆)”和“双手(工具)”?

在今天的大模型开发学习中,我完成了一次极其核心的跨越------从单纯地调用大模型聊天,进阶到了构建具有记忆能力和行动能力的AI Agent(智能体)雏形。

大模型本身就像是一个被封印在服务器里、患有"重度健忘症"的超级大脑。今天,我通过LangChain框架,成功为它解除了这两个封印。以下是我的核心学习复盘与详细代码示例。

核心知识点一:赋予 AI "大脑" ------ 让模型拥有历史记忆

大语言模型(LLM)底层是"无状态"的,这意味着你跟它说的每一句话,它在回答完之后就会立刻忘掉。如果想让大模型记住我们在聊什么(比如记得我的名字和爱好),我们需要在代码层面,把过往的聊天记录当作一个"筐",在每次提问时连同新问题一起递给大模型。

避坑指南: 在使用RunnableWithMessageHistory 来管理多用户对话时,一定要注意字典键值的对应关系。如果要切换用户,必须更改字典里 session_id 对应的值 比如"user_123"改为 "user_456"),而不能把键名改掉,否则程序会因为找不到目标钥匙孔而报错崩溃。

实战代码:为模型注入记忆

复制代码
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistory

# ==========================================
# 1. 基础配置 (这里使用通用的 OpenAI 接口作为示例)
# ==========================================
os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["OPENAI_BASE_URL"] = "https://api.openai.com/v1" # 如果有代理地址可以填在这里

# 实例化大语言模型,temperature 控制回答的随机性(0.7比较适合日常对话)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

# ==========================================
# 2. 准备带有"记忆插槽"的提示词模板
# ==========================================
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个贴心、幽默的 AI 助手。"),
    # MessagesPlaceholder 是一个特殊的占位符,相当于一个"筐"。
    # 它会自动把下面传入的历史聊天记录打包好,放在系统提示词和最新问题之间。
    MessagesPlaceholder(variable_name="history"), 
    ("user", "{question}")
])

# 3. 将提示词模板与模型组合成基础的执行链 (Chain)
chain = prompt | llm

# ==========================================
# 4. 创建"记忆管家"
# ==========================================
# store 字典相当于一个数据库,用来存放不同用户的聊天记录
store = {}

def get_session_history(session_id: str):
    """
    根据传入的 session_id(会话ID,可以理解为用户的UID),提取对应的聊天记录。
    如果该用户是第一次来,就为他创建一个全新的空白记忆。
    """
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

# 5. 给基础执行链套上"记忆"的外壳
with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history,           # 告诉程序去哪里找历史记录
    input_messages_key="question", # 告诉程序,用户当前输入的问题在变量里的键名
    history_messages_key="history" # 告诉程序,上面提示词里的那个"筐"叫什么名字
)

# ==========================================
# 6. 测试多轮对话记忆功能
# ==========================================
print("👉 第一次对话:")
response1 = with_message_history.invoke(
    {"question": "你好,我叫阿泽,我非常喜欢打篮球!"},
    config={"configurable": {"session_id": "user_123"}} # 指定当前用户是 user_123
)
print(response1.content)
print("\n" + "="*40 + "\n")

print("👉 第二次对话 (测试记忆):")
# 此时我们再次提问,模型能根据前面的记忆,叫出我的名字并说出我的爱好
response2 = with_message_history.invoke(
    {"question": "你还记得我叫什么名字,喜欢什么运动吗?"},
    # 核心重点:一定要保证使用的是相同的 session_id,这样才能取到同一个"筐"里的记录
    config={"configurable": {"session_id": "user_123"}} 
)
print(response2.content)

当你更改了第二轮对话的值"user_123"为"user_456",结果就变成了

核心知识点二:赋予 AI "双手" ------ Tool Calling 工具调用与 Agent 闭环

大模型由于断网的特性,它无法知道当前的天气,也无法真正帮你去发邮件。要打破这个限制,我们需要使用 @tool 装饰器给 AI 打造"工具"。

更重要的是,我今天彻底弄懂了什么是 Agent(智能体)的核心闭环逻辑。 当 AI 遇到不懂的问题时,它并不会直接乱编,而是:

  1. 思考:发现问题超出了我的知识储备。
  2. 搜寻 :查看人类挂载在自己腰带上的工具(bind_tools)。
  3. 决策 :向人类发出动作指令(Function Calling),请求执行特定工具,并给出了具体参数。
  4. 人类(代码)代劳:代码收到指令后,运行真实的 Python 函数,拿到真实结果(比如从真实气象 API 获取数据)。
  5. AI 总结:拿到代码执行的真实结果后,AI 重新组织语言,给出一个极具人情味的回答。

实战代码:纯手工实现一个基础版的 Agent 循环

复制代码
import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage, ToolMessage

# 1. 基础配置
os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

# ==========================================
# 2. 打造工具 (为大模型提供连通外部世界的方法)
# ==========================================
# @tool 装饰器是魔法所在,它能让 LLM 识别出这是一个可用的工具。
# 注意:工具函数下方的多行注释(Docstring)极其重要!
# AI 完全是靠读这段注释来决定"什么时候用它"以及"传入什么参数"的。
@tool
def get_weather(city: str) -> str:
    """
    功能:获取指定城市的天气情况。
    参数:city (字符串) - 要查询天气的城市名称。
    """
    print(f"\n[后台日志] 🛠️ 触发工具调用!正在后台查询 {city} 的天气...")
    
    # 【业务说明】:在真实的生产环境中,这里绝对不是写死 if-else。
    # 而是应该编写 requests 代码,将传入的 city 发送给真实的气象局 API 接口。
    # 这里为了降低学习测试门槛,使用了 Mock (模拟) 数据展示逻辑。
    if "北京" in city:
        return "北京今天晴天,气温 25度,适合打篮球!"
    elif "上海" in city:
        return "上海今天下雨,气温 20度,出门记得带伞。"
    else:
        return f"暂时无法获取 {city} 的天气信息。"

# 把工具"挂"在 AI 模型上,告诉它你有这些能力
llm_with_tools = llm.bind_tools([get_weather])

# ==========================================
# 3. Agent 核心执行闭环:思考 -> 调度 -> 反馈 -> 回答
# ==========================================

# 步骤一:记录用户的真实提问
messages = [HumanMessage(content="阿渊想去运动,请问北京今天天气怎么样?")]
print("👤 用户提问:", messages[0].content)

# 步骤二:AI 第一次思考 
# 此时 AI 会发现自己不知道天气,但发现自己身上带着 get_weather 工具。
# 所以它不会返回普通对话,而是返回一个"工具调用请求"。
ai_msg_1 = llm_with_tools.invoke(messages)
messages.append(ai_msg_1) # 将 AI 的请求也保存到聊天记录中

# 判断 AI 是否请求了调用工具
if ai_msg_1.tool_calls:
    for tool_call in ai_msg_1.tool_calls:
        print(f"🤖 AI 发出动作指令: {tool_call['name']}, 携带参数: {tool_call['args']}")
        
        # 步骤三:代码代替 AI 执行真实的工具函数
        # LangChain 的 tool.invoke 可以直接接收 AI 发出的结构化请求并运行代码
        tool_msg = get_weather.invoke(tool_call) 
        
        # 步骤四:将真实代码执行获取到的结果(ToolMessage),追加进对话历史中
        messages.append(tool_msg)
        print(f"✅ Python代码执行完毕,真实数据已拿到,准备喂回给 AI...")

# 步骤五:AI 读取了包含"用户问题"+"工具执行结果"的完整对话记录后,进行第二次思考
print("\n🤖 AI 结合工具反馈的数据,进行最终回复:")
final_ai_msg = llm_with_tools.invoke(messages)
print(final_ai_msg.content)

输出示例:

总结体会

今天最重要的感悟是:Tools (工具) 的本质,其实就是一个传声筒。 大模型想要某个数据(比如获取某个城市名称的天气),它把参数通过传声筒递给程序员;程序员用任何自己喜欢的 Python 代码(请求外部API、查本地数据库、甚至去读一个 Excel 文件)拿到真实数据后,再通过传声筒把结果塞回给大模型。

这就是目前市面上所有高级 AI Agent(包括 LangGraph、CrewAI 等框架)最底层的运行逻辑。只不过高级框架帮我们省略了写 if tool_calls 这种手动判断的死代码,将整个流程变成了全自动化的流水线。

掌握了这个基础,接下来的复杂智能体开发,对我来说就不再是一个完全未知的黑盒了!

相关推荐
m0_466525291 小时前
东软添翼医疗大模型领跑 医疗AI进入“可信时代”
人工智能
美团技术团队1 小时前
美团 LongCat 开源 General 365:树立推理评测新标尺
人工智能
eastyuxiao1 小时前
能源电力领域的数字孪生应用场景有哪些
大数据·人工智能·智慧城市·能源·数字孪生
Amctwd1 小时前
【Python】从Excel中按行提取图片
java·python·excel
张二娃同学1 小时前
第08篇_RNN_LSTM_GRU序列模型
人工智能·python·rnn·深度学习·神经网络·gru·lstm
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月13日
大数据·人工智能·python·信息可视化·语言模型·自然语言处理
我的世界洛天依1 小时前
胡桃讲编程|公益开源模型「初音未来」R1 声库(RVCv2 第一代)开发日志:低配 1050Ti 也能训的经典国语声线
人工智能
qq_411262421 小时前
四博AI睡眠眼罩方案:白噪音、音乐疗愈、AI情绪陪伴,把智能音箱做成贴身睡眠助手
人工智能·智能音箱
掘金安东尼1 小时前
AI 时代没必要太焦虑:当 Codex 已经打开即用,为啥还要折腾“小龙虾”?
人工智能
qq_411262421 小时前
基于 ESP32-S3 的四博AI双目智能音箱方案:双目同显/异显、素材上传、触摸、G-sensor、舵机、Wi-Fi/4G/TWS音频扩展
人工智能·microsoft·智能音箱