)
目录一,实操编码RunnableRunnable 是什么核心方法(所有 Runnable 都有)最关键能力:用 | 组合(LCEL)常用内置 Runnable总结二,聊天模型-核心能力定义模型init_chat_model本地部署调用工具定义工具-Toolversion1schema:version2(基于Pydantic)version3(基于Annotated)定义工具-StructredToolversion1version2(基于Pydantic)version3(基于response_format)核心概念整理总结绑定工具选择工具调用工具langchain提供的工具TavilySearch结构化返回PydanticTypedDictJson Schema选择结构使用场景作为信息提取器使用少样本提示来增强信息提取能力(后文再介绍)与工具结合使用流式传输stream()-同步传输astream()-异步传输进程、线程、协程的区别异步协程版本核心概念什么时候用协程?自定义输出格式深度流式输出的探索SSE协议Langchain流式传输流程分析一,实操编码依赖安装-见见猪跑pip install langchain-openai langchain-core -i https://pypi.tuna.tsinghua.edu.cn/simplefrom langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI # 初始化 DeepSeek 模型(兼容 OpenAI 接口) model = ChatOpenAI( model="deepseek-chat", api_key="你的DeepSeek密钥", #可定义为系统环境变量 base_url="https://api.deepseek.com/v1", temperature=0.0 #精确度 ) # model = ChatOpenAI( # model="deepseek-chat", # base_url="https://api.deepseek.com/v1", #) # 构造系统提示 + 用户消息 messages = [ SystemMessage(content="你的任务是翻译,只输出翻译后的英文,不要回答问题,不要额外解释。"), HumanMessage(content="你是谁") ] # 字符串输出解析器 parser = StrOutputParser() # LCEL 链式调用:模型 | 解析器 chain = model | parser # 执行并打印结果 print(chain.invoke(messages)) #DeepSeek 兼容 OpenAI 接口,只需配置 base_url + 自身 APIKey 即可调用; #temperature=0.0 降低随机性,严格遵循系统指令; #StrOutputParser 直接提取纯文本结果,去除模型冗余包装; #用 模型 | 解析器 LCEL 链式写法,代码更简洁优雅。RunnableRunnable 是什么Runnable 是 LangChain 所有可执行组件的统一标准接口(在langchain_core.runnables中定义)。只要实现了这个接口,LLM、Prompt、解析器、检索器、自定义函数、甚至整条链 / Graph,都能用同一套方法调用、组合、部署。一句话:它是 LangChain 的 “万能积木” 规范。核心方法(所有 Runnable 都有)invoke(input):同步执行,输入→输出(最常用)ainvoke(input):异步执行batch([inputs]):批量并行处理多个输入stream(input):流式返回(大模型逐字输出)最关键能力:用|组合(LCEL)所有 Runnable 都能用管道符|串成工作流(LangChain Expression Language):chain = prompt | llm # chain = RunnableSequence ( first=prompt , second=llm ) # chain = prompt.pipe(llm) # 以上效果相同自动变成一个新 Runnablereference.langchain.com自动支持:同步 / 异步、批量、流式reference.langchain.com前一步输出 = 后一步输入,无需手动传参常用内置 RunnableRunnableLambda:把任意 Python 函数包装成 RunnableRunnablePassthrough:原样透传输入(用于分叉 / 保留中间结果)RunnableParallel:并行执行多个分支RunnableBranch:按条件走不同分支总结Runnable = 统一接口 + 四种执行方式 + 管道组合,让 LangChain 组件能像积木一样快速拼出复杂 AI 工作流reference.langchain.com二,聊天模型-核心能力定义模型init_chat_model1.基本用法#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 定义模型1:api_key 加上 英文双引号! model1=ChatOpenAI( model="deepseek-chat", api_key="你的DeepSeek密钥", base_url="https://api.deepseek.com/v1" ) #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 定义模型2 model2= init_chat_model( model="deepseek-chat", model_provider="deepseek", #指定厂商 api_key="你的DeepSeek密钥" ) # 【优化指令:强制模型只做翻译】 message = [ SystemMessage(content="严格执行:只做中文翻译成英文,禁止回答、禁止解释、禁止闲聊,只输出翻译结果!"), HumanMessage(content="你是谁"), ] # 解析器 + 链 parse = StrOutputParser() chain = (model | parse) # 运行 print(chain.invoke(message)) #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2.可配置的模型from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser from langchain.chat_models import init_chat_model #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 未定义模型,仅作初始化 model = init_chat_model( temperature=0.0 ) #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 【优化指令:强制模型只做翻译】 message = [ SystemMessage(content="严格执行:只做中文翻译成英文,禁止回答、禁止解释、禁止闲聊,只输出翻译结果!"), HumanMessage(content="你是谁"), ] # 解析器 + 链 parse = StrOutputParser() chain = (model | parse) # 利用模型的invoke指定模型并运行 print(chain.invoke(message,config={"configurable":{"model":"deepseek-chat"}}))3.可配置的模型(默认值)from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser from langchain.chat_models import init_chat_model # 未定义模型,仅作初始化 model = init_chat_model( model="deepseek-chat", model_provider="deepseek", temperature=0.0, max_tokens=1024 ) # 【优化指令:强制模型只做翻译】 message = [ HumanMessage(content="你是谁"), ] # 解析器 + 链 parse = StrOutputParser() chain = (model | parse) # 运行 print(chain.invoke( message, config={ "configurable":{ "max_tokens":"20" } } ) )如代码所示:我将"max_tokens":"1024"改变为==》"max_tokens":"20"含义为回答上限最大为20token,结果却并不符合预期#结果展示 #D:\code\review\OwnTest\.venv\Scripts\python.exe D:\code\review\OwnTest\test3.py #你好!我是DeepSeek,由深度求索公司创造的AI助手。我是一个纯文本模型,可以帮你解答问题、处#理信息、进行对话等。我支持阅读链接、上传文件(图片、PDF、Word、Excel等),还能联网搜索(需#要手动开启)。我的上下文长度达到1M,可以一次性处理像《三体》三部曲那样体量的书籍。最重要的#是,我完全免费使用!有什么我可以帮你的吗?😊 #进程已结束,退出代码为 0原因是未定义configurable_fields=("max_tokens",),config_prefix="first":# 未定义模型,仅作初始化 model = init_chat_model( model="deepseek-chat", model_provider="deepseek", temperature=0.0, max_tokens=1024, configurable_fields=("max_tokens",), config_prefix="first" #前缀 ) # 运行 print(chain.invoke( message, config={ "configurable":{ "first_max_tokens":"20" } } ) ) #结果: #D:\code\review\OwnTest\.venv\Scripts\python.exe D:\code\review\OwnTest\test3.py #你好!我是DeepSeek,由深度求索公司创造的AI助手。我是一个纯文本模型 #进程已结束,退出代码为 0本地部署前置条件需要部署本地模型,同时安装ollama包。pip install -Ulangchain_ollama调用工具LLM 本身是封闭知识系统,能力受限于:训练数据存在滞后性仅能进行文本生成,无法执行计算、查询实时信息、操作数据库或调用外部 API工具的具体作用扩展能力边界:借助工具完成自身无法实现的任务,如数学计算、网络搜索、数据库查询等。保证信息实时性:通过搜索 / 数据库查询工具获取训练数据外的最新信息,避免过时或错误回答。处理复杂任务:将复杂请求拆解为多步骤,依次调用不同工具协同完成(如 “获取数据→数据分析→生成图表”),这一协调能力在 Agent 智能体上体现更明显。连接现有系统:将企业内部系统、API、数据库封装为工具,使 LLM 成为自然语言驱动的统一接口,提升自动化与集成能力。定义工具-Tool工具=@tool+python函数version1from langchain_core.tools import tool @tool def add(a:int,b:int)-int: """两数相加 Args: a:第一个整数 b:第二个整数 """ return a+b print(add.invoke({'a': 5, 'b': 6})) #res: #D:\code\review\OwnTest\.venv\Scripts\python.exe D:\code\review\OwnTest\test4.py #11 # #进程已结束,退出代码为 0从中我们发现工具定义:函数名,字符串文档和类型提示缺一不可,这些实际上都是传递给工具schema。schema:如下为一段简单的json代码,而JSON Schema是用来描述json的结构的,而工具schema则是用来描述工具的。//json 要有字段 值类型 { "name": "test", "age": 20, "isStudent": true, "hobby": ["编程", "阅读", "运动"] } //json schema { "type": "object", "properties": { "surname": {"type": "string"}, "given_name": {"type": "string"}, "birthday": {"type": "string","format": "date"}, "address": {"type": "object","properties": { "district": {"type": "string"}, "city": {"type": "string"}, "province": {"type": "string"}, "country": {"type": "string"} } } } } { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "title": "用户信息", "description": "匹配你提供的JSON结构", "pr