LangChain 的核心模块(Models, Prompts, Chains, Memory, Agents)

以下内容为AI对话生成

核心模块概览

可以把这五大模块想象成一个智能机器人的不同部分:

  • Models(模型):机器人的“大脑”,负责真正的思考和生成。
  • Prompts(提示):你给机器人的“指令”和“问题背景”,引导它如何思考。
  • Chains(链):机器人的“工作流程”,把简单任务组合成复杂任务。
  • Memory(记忆):机器人的“短期记忆”,让它能记住对话历史。
  • Agents(代理):机器人的“决策中心”,它决定调用什么工具来完成任务。

下面我们逐一深入讲解。


1. Models(模型)

这个模块是所有功能的基石,它提供了与各种大语言模型(LLMs)和聊天模型(ChatModels)交互的统一接口。

  • 功能:抽象了不同模型提供商(如 OpenAI, Anthropic, Hugging Face 等)的 API 差异,让你用一套统一的代码调用不同的模型。
  • 核心类
    • LLM:用于纯文本补全模型(如早期的 text-davinci-003)。输入一段文本,输出一段补全的文本。
    • ChatModel:用于对话模型(如 gpt-4, gpt-3.5-turbo, claude-2)。输入是一个消息列表SystemMessage, HumanMessage, AIMessage),输出是一个 AIMessage。这是目前最主流的模式。
  • 重要概念 - Embeddings:虽然不属于 LLM/ChatModel,但也常被归在 Models 模块下。它负责将文本转换为高维向量,用于检索、比较和聚类(是 RAG 的基石)。
  • 示例
    from langchain_openai import ChatOpenAI
    from langchain.schema import HumanMessage
    
    # 初始化模型
    chat = ChatOpenAI(model_name="gpt-3.5-turbo")
    
    # 调用模型
    messages = [HumanMessage(content="你好!请介绍一下你自己。")]
    response = chat.invoke(messages)
    print(response.content)
    

2. Prompts(提示)

Prompt 是指导和约束模型输出的关键。这个模块提供了用于高效构建、管理和优化提示词的模板工具。

  • 功能:将用户输入、指令示例、上下文等信息动态地组合成模型最终看到的提示词,避免手动拼接字符串的混乱。
  • 核心类
    • PromptTemplate最重要的工具。允许你创建一个带有变量的模板,然后在运行时传入变量值来生成具体的提示。
    • FewShotPromptTemplate:用于创建少样本(Few-Shot)学习的提示,即在指令中包含一些输入输出的示例,让模型更好地理解任务。
    • ChatPromptTemplate:专门用于构建聊天模型所需的消息列表模板。
  • 示例
    from langchain.prompts import PromptTemplate
    
    # 创建一个带变量的模板
    template = """
    你是一个专业的翻译官。请将以下 {source_language} 文本翻译成 {target_language}:
    文本:{text}
    翻译:
    """
    prompt_template = PromptTemplate.from_template(template)
    
    # 使用变量生成最终提示
    final_prompt = prompt_template.format(
        source_language="英语",
        target_language="中文",
        text="Hello, world! LangChain is amazing."
    )
    print(final_prompt)
    # 然后将 final_prompt 传给 LLM
    

3. Chains(链)

Chain 是 LangChain 的核心价值所在。单个模型调用能力有限,Chain 允许你将多个模型调用、其他工具或逻辑步骤链接起来,形成一个序列化的、复杂的工作流。

  • 功能:实现多步骤任务,其中一个步骤的输出可以作为下一个步骤的输入。
  • 核心类
    • LLMChain:最基础、最常用的链,它组合了一个 PromptTemplate 和一个 LLM/ChatModel
    • SequentialChain:允许多个链按顺序执行。
    • RouterChain:根据输入内容智能地选择执行不同的子链。
  • 示例:实现“翻译+总结”链
    from langchain.chains import LLMChain, SimpleSequentialChain
    from langchain.prompts import PromptTemplate
    
    # 第一步的链:翻译
    translation_template = "将以下英文文本翻译成中文:{text}"
    translation_prompt = PromptTemplate.from_template(translation_template)
    translation_chain = LLMChain(llm=chat, prompt=translation_prompt)
    
    # 第二步的链:总结
    summary_template = "对以下中文文本做一个简要总结:{text}"
    summary_prompt = PromptTemplate.from_template(summary_template)
    summary_chain = LLMChain(llm=chat, prompt=summary_prompt)
    
    # 将两个链组合成顺序链
    overall_chain = SimpleSequentialChain(
        chains=[translation_chain, summary_chain],
        verbose=True # 打开详细日志,方便查看执行过程
    )
    
    # 运行这个工作流
    english_text = "LangChain is a framework for developing applications powered by language models..."
    result = overall_chain.run(english_text)
    print(result)
    

4. Memory(记忆)

由于 LLM 本身是无状态的,Memory 模块为应用提供了“记忆”能力,使其能够记住跨多次调用的信息,这对于聊天机器人等应用至关重要。

  • 功能:在链或代理的多次调用之间持久化状态(对话历史)。
  • 核心类
    • ConversationBufferMemory:最简单的一种,直接保存所有过去的对话消息。
    • ConversationSummaryMemory:更高级,会调用 LLM 将时间久远的对话总结成一个简短的摘要,从而节省 Token 并抓住长期重点。
    • ConversationBufferWindowMemory:只保留最近 K 轮对话,像一个滑动窗口,防止记忆无限增长。
  • 示例
    from langchain.memory import ConversationBufferMemory
    from langchain.chains import ConversationChain
    
    # 初始化记忆体
    memory = ConversationBufferMemory()
    
    # 创建一个带记忆的对话链
    conversation = ConversationChain(
        llm=chat,
        memory=memory,
        verbose=True
    )
    
    print(conversation.run("你好,我叫小明。"))
    print(conversation.run("我最喜欢的产品是iPhone。"))
    print(conversation.run("你还记得我的名字和我喜欢什么吗?")) # AI会记得之前的对话
    

5. Agents(代理)

这是最强大、最令人兴奋的模块。代理将一个 LLM 作为“大脑”或“决策者”,它可以根据用户输入自主地决定需要执行哪些动作(调用哪些工具),并最终整合所有结果来给出答案。

  • 功能:扩展模型能力,使其可以调用外部工具(如搜索引擎、计算器、数据库、API等)。
  • 核心概念
    • Agent:代理本身,包含决策逻辑。
    • Tool:代理可以调用的函数。比如:Google 搜索、Python REPL、数据库查询等。你可以轻松创建自定义工具。
    • AgentExecutor:负责运行代理,管理其与工具的交互循环(思考 -> 执行工具 -> 观察结果 -> 再思考...直到得出最终答案)。
  • 示例
    from langchain.agents import load_tools, initialize_agent, AgentType
    from langchain.agents import Tool
    
    # 假设我们有一个自定义工具:计算字符串长度的函数
    def calculate_length(text: str) -> str:
        return f"The length is {len(text)} characters."
    
    # 将函数包装成Tool
    tools = [
        Tool(
            name="String Length Calculator",
            func=calculate_length,
            description="Useful for when you need to calculate the length of a string."
        )
    ]
    
    # 初始化一个代理
    agent = initialize_agent(
        tools,
        chat,
        agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 一种通用的代理类型
        verbose=True
    )
    
    # 运行代理!它会自动判断是否需要使用工具。
    result = agent.run("What is the length of the word 'LangChain'?")
    print(result)
    # 输出: The length is 9 characters.
    # 过程中你会看到代理决定调用计算器工具的日志。
    

总结

这五大模块由低到高,层层递进:

  1. ModelsPrompts 是原材料(砖块和水泥)。
  2. Chains 是用原材料砌成的一面墙(完成一个复杂但固定的任务)。
  3. Memory 是给这面墙刷上好看的油漆,让它更实用(上下文)。
  4. Agents 是用这些墙、油漆,再加上各种工具(家具、电器),最终搭建出的一个能自主行动的智能机器人
posted @ 2025-09-12 15:26  PyAj  阅读(97)  评论(0)    收藏  举报