type
Post
status
Draft
date
Mar 3, 2026
slug
langchain-001
summary
tags
AI
LLM
Agent
category
LangChain
icon
password
LangChain
理论概述
是什么
- LangChain
- 等价于
- LangChain For Python
LangChain是2022年10月底,由哈佛大学的Harrison Chase(哈里森·蔡斯)发起的基于开源大语言模型的AI工程开发框架。顾名思义,LangChain中的“Lang”自然是指大语言模型,“Chain”即“链”,也就是将大模型与其他组件连接成链,借此构建AI工程应用LangChain的发布比ChatGPT问世还要早一个月,从这个启动日期也可以看出创始人的眼光,占了先机的它迅速获得广泛关注和支持!
- LangChain4J
- 等价于
随着人工智能(AI)技术的迅猛发展,越来越多的开发者开始将目光投向AI应用的开发。然而,目前市场上大多数AI框架和工具如LangChain、PyTorch等主要支持Python,而Java开发者常常面临工具缺乏和学习门槛较高的问题,但是不用担心,谁让Java/Spring群体强大那?,O(∩_∩)O 任何一个框架/XXX云服务器,想要大面积推广,应该不会忘记庞大的Spring社区和Java程序员
- AB法则(Before | After)
- Before
- After
- 一句话
- 就是一套把大模型和外部世界连接起来的工具代码。
能干嘛
- 大模型开发分类
- Boss直聘对标岗位说明......
- LLM大模型能干什么
- controller
- service
- dao/mapper
- LLM大模型应用技术架构
去哪下
- 官网地址
- github地址:
怎么玩
- 为什么现在是学习LangChain的最佳时机?
它生态太强了。·你想用的任何工具(Google Search,Wikipedia, Notion, Gmai...),LangChain里都有现成的组件。·你想用的任何技术(RAG,ReAct,MapReduce...,LangChain里都有现成的模板。它就像AI届的Spring框架或者React框架,虽然臃肿,虽然有坑,但它是目前最快上手、资源最多的选择。 对于初学者,阳哥的建议是:不要试图去学完LangChain的所有API,那是不可能的。你只需要搞懂它的核心逻辑(后面会介绍的六大核心模块)然后,用到什么再去查什么。把它当成一个工具箱,而不是一本教科书。
- 总体架构图
- V0.1 版本
- V0.2 / V0.3 版本
- LangChain 1.0架构:轻核心与模块化
LangChain生态系统的主要组件及其分类,分为三个层次:架构(Architecture)、组件(Components)和部署(Deployment)。 - 最底层是架构部分,包括LangChain和LangGraph,它们均开源(OSS)。LangChain负责提供基础的链条设计与构建功能,而LangGraph扩展了图形化建模能力,用于更加复杂的链条架构设计。 - 中间层是组件部分,标注为开源(OSS)的Integrations模块,负责与外部工具或服务集成,例如与API、数据库或第三方模型交互,支持灵活扩展与适配。 - 最顶层是部署部分,包括LangGraph Cloud和LangSmith。其中LangGraph Cloud是商业化的云端解决方案,支持跨平台部署与管理;LangSmith则提供一系列商业化的功能模块,如调试、交互式测试环境、提示管理、注释工具、性能测试以及监控功能,用于提升开发效率与产品稳定性。
langchain-Core:基础抽象和LangChain表达式语言 (LCEL),构成应用程序认知架构的Chains,Agents,Retrieval strategies等langchain-community:第三方集成,比如:合作伙伴包 langchain-openai,langchain-anthropic等LangGraph:LangGraph能够协调多个Chain,Agent,Tools完成更复杂的任务,并且还支持循环调用,是langchain图形化的增强版
- 六大金刚
- Models(模型)
- Memory(记忆)
- Retrieval(检索)
- Chains(链)
- Agents(智能体)
- Callback(回调)
LangChain的六大组件的耦合非常松散,各组件之间没有调用顺序,也没有固定的接口。开发者可以自由设计并组合它们
LangChain是完美的吗?不,非常操蛋/(ㄒoㄒ)/~~
虽然LangChain现在是业界的扛把子,但它的糟心事也真的不少。 1,文档写得乱:这是公认的。LangChain更新太快了,大概两三天就是一个新版本。官方文档经常跟不上代码的更新速度,你在文档里看到的方法,可能在最新版代码里已经被改名或者删除了。这对新手极其不友好。 2,抽象过度:为了兼容所有的模型和数据库,LangChain封装了一层又一层。有时候你只想做一个简单的功能,结果发现要调用的类藏在很深的地方。这也导致了所谓的”LangChain很慢”的说法——不是运行慢,是调试代码的时候脑子转得慢,因为调用栈太深了。 3,版本不兼容:你今天写的代码,下个月升级了LangChain可能就跑不通了。
- ChatModel
- Agent
- 还有其它......
LangChain1.0与AI原生的未来
LangChain正在从一个“代码库”进化成一套完整的“AI开发操作系统”。而且,随着大模型本身的能力越来越强(比如GPT-4的Context窗口越来越大,能一次性读完一本书),也许未来简单的RAG不需要那么复杂的切片逻辑了。 但Agent(智能体)的逻辑会越来越重要。 未来的AI应用,一定不是简单的”一问一答”,而是”一句话解决复杂任务”。比如:“帮我写个游戏,然后发布到AppStore”。这中间涉及到写代码、画图、测试、填表单、上传等几十个步骤。 LangChain就是在为这种未来打地基。
永远的HelloWorld
前置约定
- LangChain支持的各种大型语言模型(LLMs)
- https://docs.langchain.com/oss/python/integrations/providers/overview#popular-providers
- 阳哥本次课程以阿里百炼平台(通义千问)为主并辅以DeepSeek模型+openrouter,当然,通过后续讲解配置规则,同时也适用于其他模型,为谷粉提供更广泛的适用性和灵活性学习思路
- 动手前模型约定
- Subtopic
- Subtopic
- 配置门道和关键点
- 通过后续讲解配置规则,所有调用均基于 OpenAI协议标准或者具体模型官方推荐整合规则,实现一致的接口设计与规范,确保多模型切换的便利性,提供高度可扩展的开发支持
- 两版本对比
- 统一模型入口:init_chat_model
统一模型入口:init_chat_model
大模型服务平台
LangChain作为一个“工具”,依赖于第三方集成各种大模型。有许多提供大模型API服务的平台,使用时只需要注册、充值并创建API-Key,之后即可使用API-Key与URL来调用平台提供的相应的模型的服务。
- OpenRouter:https://openrouter.ai/
Python+LangChain安装依赖包
- 实操命令
想让当前虚拟环境以后默认走清华源,可先执行:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple - 安装langchain- 安装langchain-openai- 安装openai- 安装dotenv- 安装langchain-core # langchain 提供核心框架(Chain, Agent, Memory, Retriever等)pip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simple # 提供OpenAI专用组件(LLM, Chat, Embeddings等),依赖 openai SDKpip install langchain-openai -i https://pypi.tuna.tsinghua.edu.cn/simplepip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple # 通过 python-dotenv 库读取 env 文件中的环境变量,并加载到当前运行的环境中pip install python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple pip install langchain-core
永远的HelloWorldV1---零基础入门
- 阿里云百炼平台入口官网
- 接入阿里百炼平台的通义模型 https://bailian.console.aliyun.com/
- 大模型调用三件套
- 获得Api-key
- 获得模型名
- 1
- 1.1
- 2
- 模型名
- qwen-plus
- qwen3-max
- 获得baseUrl开发地址
- 小总结
- API Key
- sk-xxx你自己的API Key
- 模型名
- qwen-plus
- qwen3-max
- 调用地址
- 使用SDK调用时需配置的base_url:https://dashscope.aliyuncs.com/compatible-mode/v1
- 案例代码
- LangChain0.3版本使用方式
- LangChain1.0版本使用方式
- 对比
LangChain0.3版本使用方式,了解即可,目前再用# 1.导入依赖from langchain_openai import ChatOpenAIfrom openai import OpenAIimport osfrom dotenv import load_dotenv# 第1版:硬编码写死# llm = ChatOpenAI(# model="qwen-plus",# # 硬编码写死# api_key="sk-4fb1edd27f744a278e1e260d2302fdc3", # 平台提供的 API-Key# base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"# )# 第2版:配置进环境变量# llm = ChatOpenAI(# model="qwen-plus",# # 配置进环境变量# api_key=os.getenv("aliQwen-api"),# base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"# )# 第3版:通过 python-dotenv 库读取 env 文件中的环境变量,并加载到当前运行的环境中# 加载.env文件中的环境变量(指定编码,避免中文乱码)load_dotenv(encoding='utf-8')llm = ChatOpenAI( model="deepseek-v3.2", # 配置进环境变量 api_key=os.getenv("QWEN_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")## # 2.提供问题,并调用llmresponse = llm.invoke("你是谁")print(response)print()print(response.content)print()
LangChain1.0+版本使用方式,目前主流# 1.导入依赖import osfrom dotenv import load_dotenvfrom langchain.chat_models import init_chat_model# 2.实例化模型model = init_chat_model( model="qwen-plus", model_provider="openai", api_key=os.getenv("aliQwen-api"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 3.调用模型print(model.invoke("你是谁").content)# model_provider="openai",# ValueError: Unable to infer model provider for model='qwen-plus', please specify model_provider directly.print("*" * 50)#通过 python-dotenv 库读取 env 文件中的环境变量,并加载到当前运行的环境中load_dotenv(encoding='utf-8')model2 = init_chat_model( model="deepseek-v3", model_provider="openai", api_key=os.getenv("QWEN_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 3.调用模型print(model2.invoke("你是谁").content)
问题思考,更进一步,O(∩_∩)O
- 要求同时存在多种大模型产品在系统里共存使用
永远的HelloWorldV2---PlusPlus
- DeepSeek API 文档
- https://platform.deepseek.com/usage
- DeepSeek API 文档
- 大模型调用三件套
- 获得Api-key
- 获得模型名
- 获得baseUrl开发地址
- 备注
- 通过指定 model='deepseek-chat' 对应 DeepSeek-V3.2 的非思考模式
- 通过指定 model='deepseek-reasoner'对应 DeepSeek-V3.2 的思考模式
- 两个模型案例代码
LangChain1.0+版本使用方式,目前主流,多模型共存# 1.导入依赖from dotenv import load_dotenvfrom langchain.chat_models import init_chat_modelimport os# .env文件读取load_dotenv()# 2.实例化模型model = init_chat_model( model="qwen-plus", model_provider="openai", api_key=os.getenv("QWEN_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")# 3.调用模型print(model.invoke("你是谁").content)print("*" * 70)# 4.实例化模型v2model = init_chat_model( model="deepseek-chat", # deepseek-chat 对应 DeepSeek-V3.2 的非思考模式 api_key=os.getenv("deepseek-api"), base_url="https://api.deepseek.com")# 5.调用模型v2print(model.dict)print(model.invoke("你是谁").content)
企业级+流式输出
- 流式输出
- 企业级
导入必要的库from langchain_openai import ChatOpenAIimport osfrom dotenv import load_dotenvfrom langchain_core.exceptions import LangChainException# 加载.env文件中的环境变量(指定编码,避免中文乱码)load_dotenv(encoding='utf-8')# 配置日志(可选,便于调试)import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')logger = logging.getLogger(name)def init_llm_client() -> ChatOpenAI: """ 初始化LLM客户端(封装成函数,提高复用性) Returns: ChatOpenAI: 初始化后的LLM客户端实例 """ # 1. 读取环境变量并做非空校验 api_key = os.getenv("QWEN_API_KEY") if not api_key: raise ValueError("环境变量 QWEN_API_KEY 未配置,请检查.env文件") # 2. 初始化LLM客户端(参数命名规范,添加注释) llm = ChatOpenAI( model="deepseek-v3.2", # 模型名称 api_key=api_key, # 通义千问API密钥 base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 阿里云兼容接口地址 temperature=0.7, # 可选:添加温度参数,控制输出随机性 max_tokens=2048 # 可选:限制输出长度,避免超限 ) return llmdef main(): """主函数:封装核心逻辑,符合Python工程化规范""" try: # 初始化客户端 llm = init_llm_client() logger.info("LLM客户端初始化成功") # 调用模型(问题用变量存储,提高可读性) question = "你是谁" response = llm.invoke(question) # 格式化输出结果(而非直接打印原始对象) logger.info(f"问题:{question}") logger.info(f"回答:{response.content}") print("====================以下是流式输出,另一种调用方式") print("*" * 50) responseStream = llm.stream("介绍下langchain,300字以内") for chunk in responseStream: print(chunk.content,end="") # 捕获具体异常(而非宽泛的Exception) except ValueError as e: logger.error(f"配置错误:{str(e)}") except LangChainException as e: logger.error(f"模型调用失败:{str(e)}") except Exception as e: logger.error(f"未知错误:{str(e)}")# 脚本入口(符合Python规范,避免导入时执行代码)if name == "main": main()
题外话:铺垫延展LangGraph
- 核心理念变革:从“链式”到“图状”思维
📎 参考文章
- 一些引用
- 引用文章
欢迎您在底部评论区留言,一起交流~
Loading...
