【8】Langchain核心架构基础

【8】Langchain核心架构基础
Langchain的概念及核心LangChain是一个用于开发由大型语言模型驱动的应用程序的开源框架,它通过模块化设计将复杂的AI任务分解为可管理的组件,使开发者能够灵活构建、调试和扩展AI应用。其核心架构围绕三大关键模块展开:Components(组件):这是 LangChain 的基础单元,包括 LLM Wrappers(大模型接口封装)、Prompt Templates(提示词模板)和 Indexes(信息检索索引)。这些组件为开发者提供了标准化的接口,可以快速连接不同的大模型(如 GPT、Bard),并统一管理提示词格式和数据检索逻辑,避免重复造轮子。Chains(链):链是将多个组件按顺序组合起来解决特定任务的流程。例如,可以构建一个“文档问答链”:先通过 Indexes 从大量文本中检索相关信息,再用 Prompt Templates 生成结构化提示,最后调用 LLM 生成答案。这种链式结构让复杂任务变得透明可控,支持调试和可视化执行过程。Agents(代理):代理是 LangChain 的高级功能,它允许大模型与外部环境交互。比如,Agent 可以根据用户指令自动调用 API、查询数据库或发送邮件,实现“自主思考+执行”的智能体能力。这突破了传统大模型仅能“回答问题”的局限,使其成为能主动完成任务的助手。LangChain 的设计哲学是“乐高式开发”,开发者可以像搭积木一样自由组合组件、链和代理,快速构建聊天机器人、文档分析工具、代码助手等应用。它还内置了记忆模块、事件回调等高级功能,支持多轮对话状态追踪和复杂工作流管理,是目前 AI 应用开发领域的主流框架之一。用一个具体的例子来理解上面的概念。让我们用一个非常经典且实用的场景——“智能旅行规划助手”,来把 LangChain 的这三个核心概念(Components、Chains、Agents)串起来理解。假设你想做一个 AI 应用,用户输入:“我想去日本玩5天,预算2万,帮我做个攻略并查一下明天的天气。”如果没有 LangChain,你只能把这句话直接扔给大模型(LLM),它可能会编造一个行程,而且完全不知道明天的真实天气(因为它没有联网能力)。有了 LangChain,我们可以这样构建这个应用:1. Components(组件):基础的积木块这是最底层的工具。在这个场景里,我们需要准备以下“积木”:Prompt Templates(提示词模板):你不能只把用户的原话给模型,需要包装一下。比如设计一个模板:“你是一个专业的旅行管家。用户想去{destination}玩{days}天,预算{budget}。请根据这些信息生成详细行程。” 这里的{}就是变量,随时可以替换。LLM Wrappers(模型接口):这就是连接大脑的线。你可以选择连接 OpenAI 的 GPT-4,或者国内的通义千问。LangChain 帮你屏蔽了不同模型 API 的差异,换模型就像换个插头一样简单。Indexes(索引/检索工具):如果你有一本私藏的《日本深度游指南》PDF,你需要把它变成向量数据库存起来,方便后续查找。这就是 Indexes 的作用。2. Chains(链):按顺序执行的流水线现在积木有了,我们需要把它们按逻辑串起来,形成一个固定的工作流。任务:生成旅行攻略。链条逻辑:输入:接收用户说的“日本、5天、2万”。检索(Retrieval):先去你的《日本深度游指南》数据库里检索相关的景点和餐厅信息(调用 Indexes 组件)。组装(Prompting):把检索到的信息 + 用户的预算要求,填入 Prompt Template。生成(Generation):把填好的提示词发给 LLM(调用 LLM Wrapper),让它写出具体的行程安排。输出:把生成的行程展示给用户。这一套动作是固定的,不管谁来问,都是这个流程,这就是 Chain。3. Agents(代理):会思考、能动手的智能体这时候用户追加了一个需求:“帮我查一下明天东京的天气”。刚才那个固定的 Chain 傻眼了,因为它只会写攻略,不会查天气,也没有联网功能。这时候就需要Agent出场了。Agent 的大脑:Agent 接收到任务后,会先“思考”:用户要查天气,我手里没有这个数据,但我有一个叫Weather_API的工具可以用。Action(行动):Agent 决定调用Weather_API,并自动填入参数“Tokyo, Tomorrow”。Observation(观察):API 返回结果:“明天东京晴,25度”。Final Answer(最终回答):Agent 拿到天气数据,再次调用 LLM,把天气信息整合进回复里,告诉用户:“明天东京天气晴朗,气温25度,非常适合出行!结合之前的攻略……”总结一下:Components是零件(发动机、轮胎、方向盘)。Chains是自动化流水线(零件A - 零件B - 零件C,只能做固定的事)。Agents是老司机(根据路况自己决定是用零件A还是零件B,甚至下车去问路)。Langchain的底层原理用 Python 实现一个能“查天气”的 Agent,核心在于让大模型拥有**调用外部工具(Tools)**的能力。下面我将使用 LangChain 最经典的create_react_agent模式来演示。为了让代码可以直接运行且无需申请复杂的 API Key,我编写了一个模拟的天气查询函数,并配合 OpenAI 风格的接口进行演示。🛠️ 核心代码实现你需要安装langchain和openai(或其他 LLM 提供商的库)。# 1. 导入必要的库fromlangchain.agentsimportinitialize_agent,Toolfromlangchain.agentsimportAgentTypefromlangchain.chat_modelsimportChatOpenAI# 或者使用 ChatOllama, ChatTongyi 等importos# 【前置准备】设置你的 API Key (这里以 OpenAI 为例)# os.environ["OPENAI_API_KEY"] = "sk-..."# 2. 定义工具 (Tools) - 这是 Agent 的"手"defget_weather_mock(city:str)-str:""" 这是一个模拟的天气查询工具。 在实际项目中,你可以在这里调用 requests 库去访问真实的天气 API。 """print(f"\n[系统日志] Agent 正在调用工具查询{city}的天气...")# 模拟简单的逻辑weather_data={"北京":"晴朗,25度,微风","上海":"小雨,22度,湿度80%","东京":"多云转晴,26度,适合出行","纽约":"大雪,-5度,注意保暖"}# 如果城市不在字典里,返回通用回复returnweather_data.get(city,f"抱歉,我暂时查不到{city}的具体天气数据,但通常这个时候气候宜人。")# 将函数封装成 LangChain 能识别的 Tool 对象weather_tool=Tool(name="WeatherChecker",# 工具名称(Agent 会根据这个名字决定何时调用它)func=get_weather_mock,# 实际执行的函数description="当你需要查询某个城市的天气情况时使用此工具。输入必须是城市名称,例如:'北京' 或 'Tokyo'。")tools=[weather_tool]# 3. 初始化大模型 (LLM) - 这是 Agent 的"大脑"# 这里假设你配置好了 OpenAI 的环境变量llm=ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0)# 4. 创建 Agent (代理)# 使用 ZERO_SHOT_REACT_DESCRIPTION 类型,它非常适合这种根据描述自动选择工具的场景agent=initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True# 开启 verbose=True 可以看到 Agent 的思考过程(非常重要!))# 5. 运行测试print("--- 开始对话 ---")response=agent.run("我想去东京玩,那边明天天气怎么样?适合穿什么?")print(f"\n--- 最终回答 ---\n{response}")🔍 代码运行后的内部逻辑解析当你运行这段代码时,如果开启了verbose=True,你会在控制台看到类似下面的思维链(Chain of Thought),这正是 Agent 神奇的地方:用户输入:“我想去东京玩,那边明天天气怎么样?”Agent 思考 (Thought):用户想知道东京的天气。我需要先查询天气信息才能回答。我应该使用WeatherChecker工具。Agent 行动 (Action):WeatherCheckerAgent 输入 (Action Input):"东京"工具执行:控制台打印[系统日志] Agent 正在调用工具查询 东京 的天气...工具返回 (Observation):"多云转晴,26度,适合出行"Agent 再次思考 (Thought):我现在知道了东京天气是26度,多云转晴。这个温度比较舒适,我可以建议用户穿轻便的衣服。我现在可以回答用户了。最终输出 (Final Answer):“东京明天的天气预计是多云转晴,气温约26度。这个温度非常舒适,建议您穿着短袖、薄衬衫或连衣裙等轻便衣物,早晚可以备一件薄外套。”💡 关键点总结Tool 的定义是关键:Agent 本身不知道什么是“天气”,你必须通过description明确告诉它:“当用户问天气时,请用这个工具”。描述写得越清楚,Agent 越聪明。ReAct 模式:代码中使用的ZERO_SHOT_REACT_DESCRIPTION是一种经典的 Agent 范式,代表Reasoning (推理) +Action (行动)。它让模型在给出最终答案前,先进行“思考-行动-观察”的循环。替换真实 API:你只需要修改get_weather_mock函数,在里面加入requests.get('https://api.weather.com/...')的代码,它就能变成一个真正的实时天气助手。