Langchain作为大模型的高度封装工具,简化了原生大模型的使用。文章详细介绍了Langchain的调用方式,包括本地部署、标准接口和request模式,并深入讲解了Langchain的异步调用、流式输出、batch模式、多轮对话、Message封装、模板构建以及输出格式解析等关键功能。通过Langchain,开发者可以更便捷地构建LLM应用,提升开发效率。
Langchain就是一个大模型的高度封装,相当于把原生的大模型,比如说千问外面整体包了一层,这样用起来会更加方便。Langchain的核心是Langchain-core和Langchain,如果用到一些社区功能,还要加上Langchain-community,搭建Agent用的是Langgraph。
LangChain通常被用作「粘合剂」,将构建LLM应用所需的各个模块连接在一起。 把大模型和常见的功能包一层,用起来更方便。
1、大模型常见调用方式
大模型常见的调用方式,以及为什么要用Langchain
本地部署原生加载
最常见方式就是直接启动一个原生的模型,从网上把模型下载下来,本地加载model,加载分词器,输入提示词prompt,拼装提示词text(messages),模型进行分词tokenizer,生成(generated_ids)以及解码(batch_decode),最后输出结果print。
首先加载模型、加载分词器,用户输入,把用户的输入附加到模板上,训练模板,真实的模型输入是下面这个:
这是模型真实的输入,我们自己的输入放在message里,但是它前面会加一些前缀,加一些后缀,把这些东西一并输给大模型,主要原因是现在的大模型叫指令大模型。指令大模型就是说它能干很多事,要把这个指令或者说大模型的一些身份告诉大模型,加前缀比如“You are a helpful assistant 你是个有帮助的助手”,就是告诉大模型你是谁?你要干什么?这个模板就是把这些信息给附加上去,这个叫做指令大模型。
生成结果generated_ids是输入+输出,真实需要的结果是从输入后面开始要,只需要输出就可以了,输入的东西不要,因此从输出这里截下来,但是这里出来的仍然是ID,大模型是ID进ID出,通过解码把ID变成字符,最后打印出来结果。这个就是标准的加载方式。
标准接口
本地部署比较麻烦的事,第一需要把模型下载到本地,本地得有GPU才能玩,但是大多数人没有GPU,Openai提供了标准服务,它会把模型放在云端,直接访问云服务就可以。因此Openai提出了一个标准接口,好处是模型并没有在本地。
message这里需要添加一个话术,告诉大模型“你是个有帮助的助手,并且你是谁写进去”,大模型就给回答出来了,这就是一个调用AI接口的模式。
大模型都是字符串入字符串出,但是这里传的message是一个数组。
messages=[ {'role': 'system', 'content': 'You are a helpful assistant.'}, {'role': 'user', 'content': '你是谁?'}]调openai接口的时候,它会自动把messages数组填写到提示词模版,openai标准接口会自动给执行出来,就相当于包了一层,对输入进行一层包装,对输出也做了一层包装。
request模式
除了用openai标准接口以外,还可以用网络服务request模式。
request模式本质都是远程访问阿里云,指定阿里云的地址,但是request服务并没有写阿里云地址。是因为调用这个包本身就是阿里云的,默认就提供了,因此就可以直接访问了。如果数据没有涉及到隐私,往往最高效的方式就是直接调阿里云的接口。
VLLM框架,用这个框架把模型启动出来,它对外提供一个openai标准接口。很多公司可能有些忌讳,不想私有化部署但又想用这个接口,那么用这个框架把模型在机房启动起来,靠这个标准接口对外提供服务。因此VLLM框架本质也是Openai的一个标准接口的形式。
但是封装还不够,它的输入输出你也看不懂,因此Langchain就是用来进行高度封装的。
Langchain模式
导入langchain相关的包,ChatOpenAI建立大模型远程访问,指定模型名字model,指定地址base_url。把输入信息message通过SystemMessage和HumanMessage进行封装。
- SystemMessage是大模型的人设,大模型是干嘛的,它是一个物理教授还是助教等,相当于说通过提示词的方式来实现。
- HumanMessage是用户的问题,问答什么是波粒二象性。
大模型直接llm.invoke就开始使用message得到结果response。
- AIMessage是大模型输出类型,大模型回答的
- SystemMessage是大模型人设
- HumanMessage是用户的问题。
#封装后的messages1 = [ SystemMessage(content="请你作为我的物理课助教,用通俗易懂且间接的语言帮我解释物理概念。"), HumanMessage(content="什么是波粒二象性?"), ]#封装前, 原生的 messages2 = [ {"role": "system", "content": "请你作为我的物理课助教,用通俗易懂且间接的语言帮我解释物理概念。"}, {"role": "user", "content": "什么是波粒二象性?"}]原生的message,role角色是系统,role角色是user。system对应的就是SystemMessage,user对应的就是HumanMessage,给大模型效果是一样的,每次输出同样的问题都不太一样,这个主要是大模型本身输出具备一个随机性好,这个输出也不是真正的大模型输出,真正大模型输出永远是字符串,它的过程会转变成真正的字符串。
大模型的输入转换如上图,它真正的输入是最下面这个,只不过Openai和Langchain都把这一层给封装了不需要自己写了。大模型的输出永远是纯字符串,这些只是经过了层层包装,包装起来整体来说就非常方便。
- 可以传温度temperature是控制随机性,温度越高,模型输出的多样性越强。
- 也可以传最大字符数max_tokens,输入最大长度是多少,有些场景对长度要求还比较严格。常见的就是这两个参数。llm.invoke(message, temperature=0.5,max_token=200)
2、Langchain的异步调用
Langchain的异步调用,比如同时起10个线程来调用[async_generate(llm) for _ in rage(10)],分别问它“你好,你在干嘛”。
因为有时候大模型的响应时间非常长,很多异步任务,因此可以走异步调用,异步调用就是响应并不是实时的,可以看到它回答了十次, 相当于这十次就是多线程进行并行和异步。
3、Langchain的流式输出
流式输出,大模型生产出来的TOKEN其实是一个个TOKEN生成的, 但是我们看到这些结果都是一把生成,一次性给结果,但是有时候,在对话的时候,它的输出是一个字一个字的输出,并不是说一次全部给我,因为一次全部给我可能要输出很长时间,这样用户的等待时间感官就不是很好,因此会提供一个流式输出接口stream,整体输出就是involve。流式输出stream默认是用user,默认会把“你好”封装成HumanMessage(content=“你好”)。
一个字符一个字符的给打出来,虽然只有HumanMessage但是SystemMessage并不是必须的。SystemMessage只是为了做控制,SystemMessage的场景,比如要明确你是个物理学教授等,但是不强调就是一个默认的人设,像这个东西就是一个cosplay或者角色扮演,不写就是让你当个普通正常人来进行回答。
4、Langchain的batch模式
还可以进行批量的问,比如我问他 “你好,你是谁”,这里走batch,这两个问题进行一个并行回答。问了两个问题,它给的回答是两个,第一个回答是AIMessage波粒二象性,第二个回答是“你好,你叫什么名字”,它其实有两个AIMessage,这两个问题是互相隔离。
相对于一条一条的问,batch最大好处:
对GPU利用率高,数据来了,模型在GPU里,把输入放进来,算完以后从GPU里返回来,如果是一条一条的,那么搬运的次数就会非常频繁,这个其实是浪费时间。那就干脆一次性直接全部搬进去,再一次性搬出来,这样整体的效率就会高很多。减少内存到显存的搬运次数。
另外一个好处就是GPU本身运算能够被打满,GPU运算特别像集装箱。当数据量很小的时候,GPU的优势并不明显,比如运一辆汽车,用集装箱运可能跟用快艇运差异不是很大,它最大的优势就是数据量一次打入的越多,提升的效率就越明显。GPU起到了一个这样的作用,所以尽可能走批量。
阿里云后台它会把同一个时间段用户的问题拼成一个batch打给GPU,看上去好像是单条,但是它会把我和别人的全部拼在一起,直接给后台大模型,让大模型进行一个批量运算。一般的流程是来一条数据,一条请求,有一个缓存,3毫秒或者数据量到100条,再去访问大模型。这样的话就可以提升它的效率。
5、Langchain的多轮对话
搞两个Prompt对话模板,一个是人human_input用户的输入,还有一个是历史的输入chat_history,就把之前的对话全部存起来。
你是一个聊天机器人,你的历史信息是什么{chat_history},用户输入的是什么Human:{human_input},聊天机器人要输出什么Chatbot:“”,用历史信息全部拼成字符串跟当前用户的问题拼在一起来进行做问答,memory专门存历史信息,把这种模板搞定就可以了。
可以看下多人对话的效果。比如“你好,你是谁”,它就说“你好,我是AI助手”,再接着问“你会做什么呀”。因此这个就是用多轮对话的能力来做的。
6、Message
我们可以用HumanMessage对消息进行一个封装,message可以使用convert_to_openai_message进行转化,如果这个message是一个数组,SystemMessage是系统的cosplay的人设,AIMessage就是模型的回答,ToolMessage就是用的工具。
统一转成Openai标准接口如上,上面这个才是真正丢给阿里云的,阿里云提供的永远是Openapi的标准接口。一个是对用户友好,一个是对机器友好,Langchain起到一个中间环节。用户友好各种message,Langchain在中间转换为对机器友好。
它起到了一个中间环节的作用,相当于把对于用户看得懂的东西,转成对于机器有帮助的东西。
message也可以进行相加,比如有一个系统SystemMessage,还有一个HumanMessage,把两个message先相加,相当于是做一次多轮。message就是用户输入的一个封装。
7、模板
用户输入的时候,调LLM.invoke,如果不特意指定message,默认是 HumanMessage,HumanMessage有时候会存在一些变量,比如说问它“今天是星期几,后天是星期几”,通过传参的方式传给大模型。
- 做个提示词模板PromptTemplate,通过字符串构建提示词模板。
- 另外一种构建方式是指定一个变量。
#构建模板的两种方法prompt_template = PromptTemplate.from_template("{{你好}},今天是星期{day},后天是星期几?")prompt_template = PromptTemplate(input_variables=['day'], template='今天是星期{day},后天是星期几')模板生成字符串调用invoke(prompt_template.invoke), 把参数传进来,大模型运行得到结果。
大模型print回答“今天是星期三,后天是星期五”。
看模板转化之后的样子:
input_variables=['day'] input_types={} partial_variables={} template='今天是星期{day},后天是星期几?'模板有一个输入变量,“今天是星期{day},后天是星期几”,通过invoke把这个{“day”:“三”}给填进去,就变成"今天是星期三,后天是星期几",其实就是字符串占位符。
如果想让它成为一个字符串本身,但不想把它当变量,就把它当成一个字符串,“{{你好}}, 今天是星期{day}, 后天是星期几?”,可以加两对括号,把它当成正常的字符串进行处理。
构建模板的时候,可以定义两个变量,一个“今天的日期是{date},天气是{weather}”,通过函数返回值实时的把今天的日期获取出来,“date”:_get_datetime是部分变量,填充date的时候直接用函数的返回值,再把invoke({“weather”:“小雨”})给填进去,最后得到结果result。
“今天日期是08/18/2026,天气是小雨”,这个模板其实就是字符串,字符串直接传给大模型。模板是不能输给大模型的,模板本身通过invoke的字符串输入给大模型。因为模板它不是一个完整的输入。这里的函数也相当于是大模型,类似于把一个大模型的结果塞给另外一个大模型,这样就非常灵活。
模板默认是user message,稍微复杂点,可以有system message,user message,这样就跟刚开始讲的这种对话就能够对上了。
第一个是SystemMessagePromptTemplate模板,第二个是Human MessagePromptTemplate模板,invoke后就变成SystemMessage和HumanMessage,这样就可以把各种人设各种角色通过模板进行一个构建。
模板最大的好处是在进行简单问答的时候,输入是不固定的,有时候输入本身是一个变量,输入是什么事先也不知道,就通过模板的方式来进行一个构造,这个就是模板的最大作用在于这个地方,比如说写一个程序,今天是星期几,后天是星期几,那这个星期几的这个输入它是动态的。
8、控制输出格式parser
大模型是字符入字符串出,最后把结果给取出来,有时候希望输出是一个json格式,比如问“水浒传的作者和成书年份是什么”,他输出的是个字符串。但有时候想把施耐庵这三个字给提取出来,它是一个非结构化数据,所以不太好提取,但希望它输出结果是个结构化数据。
比如可以问“水浒传的成书年份是什么,输出结果用json表示,直接输出人名和年代”。加个提示词,他的作者就有了,成书年份也有了。
这个是一个非常通用的功能,因此Langchain把这个功能给抽象出来。
首先定义一个定义的Book类书籍类,书籍名称name、出版年份year,描述写清楚。parser解析器,把booke放进来,得到一串提示词,把提示词跟模型输入全拼在一起。
输出必须以json格式来输出,通过提示词来控制模型输出json的格式,除了parser以外,还有一个解析parser,两个parser,parser主要提供提示词,对输出结果进一步修复,确保解析成json格式。
Parser写出来的提示词如上,必须得输出一个JSON格式,JSON的schema,name这个字段的描述是数据的名称,year是出版年份,他其实就是把提示词进行了一次高度包装,以确保大模型能够按照这个 JSON进行输出。
模板的时候“请帮我从出版列表中解析图书信息”,/n{format_instructions}是我要的提示词,passer对应的出版列表是{query},就是输入{“query”:“水浒传出版于1929年,三国演义出版于2002年”,对应的提示词进行填充,拼接一个完整的输入扔给大模型,看大模型输出结果。
大模型输出的这是一个字符串,不是JSON,这个函数其实就是把里面对应的东西直接按字符串拼套模板往里面套。它其实不是JSON格式,已经有JSON信息了,还会用一个后处理模块,转成真正的JSON。
fix_parser最后的结果就转成了真正的JSON,取第0个name,就把水浒传给取出来。大模型输出的只具备了JSON的一些框架,但是它并不是那种数据结构的标准JSON,通过fix_parser,再进一步的把这个框架给解析出来。
这个功能非常重要,这个功能在智能体里非常重要和实用。
定义的时候用到的parser是告诉工具标准格式,目标格式是什么。为什么还里还要用大模型进行绑定llm=llm,如果说输出转不成JSON,会通过大模型再去把字符串进行一些调整,让它尽可能的变成JSON,大模型是用来兜底的,llm一旦输出,无法利用大模型修改输出,一般来说修改3次,不成功就放弃。这里的修改只是修改输出,跟用户的输入没有关系。
jsonschema不会放在system里来控制,一般通过PromptTemplate来控制是比较好的,因为模型训练的时候,就是按照这种格式来训练json的,所以就按照套路来是最好的。
如果输入“你好”,它其实是解析失败的,没有JSON信息。
什么情况下会转JSON失败,
- 第一个输出的信息本身和JSON不相关
- 第二个模型不够强,转不成。
如果说你模型太弱,能转成JSON的转不成,但是模型太强不应该转的,也给你硬转过去。函数本质是在帮你拼提示词。
大模型的知识又多又杂,到底怎么学?
做这行久了,被问最多的问题就一个:大模型的知识又多又杂,我到底先学啥?翻了一堆资料,看啥都像重点,结果啥都没学进去。今天把我自己一路摸出来的顺序捋一遍,零基础、应届生、转行的都适用。跟着走,至少方向不乱、不瞎忙,学完拿得出手。
第一阶段(10天):初阶应用
这一阶段就一个目标:把大模型真正"玩明白",不是只会聊天那种,而是能调教它、能用代码把大模型和业务接起来。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
这阶段正式进实战,目标很实在:做出两个能拿出手的东西——一个私有知识库,一个 agent 对话机器人。
为什么要做 RAG
搭建一个简单的 ChatPDF
检索的基础概念
什么是向量表示(Embeddings)
向量数据库与向量检索
基于向量检索的 RAG
搭建 RAG 系统的扩展知识
混合检索与 RAG-Fusion 简介
向量模型本地部署
…
走完这 30 天,Python 或 JavaScript 背景的基本能独立做一套 RAG 应用,简历上也敢写"大模型应用开发"了。
第三阶段(约20天):动手微调
学到这,你已经开始 “造” 模型了 —— 通过微调,搞出垂直领域的专用小模型。
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你从 “只会用” 变成 “能造” 的 AI 小子。那么你还想往下探索吗?
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
第四阶段(20天):商业闭环,部署落地
技术学完,落地才算数。这阶段带你搞明白大模型怎么真正跑起来、用起来。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
想要入坑大模型的朋友,给大家准备了一份2026 年最新 AI 大模型全套学习资料:
1、大模型系统化学习路线
2、大模型学习视频教程
3、大模型学习书籍&电子文档
4、AI大模型最新行业报告
5、大模型项目实战&配套源码
6、2026大模型大厂面试真题
7、为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。
8、适合谁学?
- 传统后端 / Java / 前端开发,想转型 AI 应用
- 大学生、应届生,想拿更好的 offer
- 产品经理、运营,想武装职业竞争力
- 技术负责人,想给团队落地提效
学习是反人性的,但回报是真金白银。技术会更新,赛道会切换,但只要你先动手,机会就永远站在你这边。
9、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
好了,就写到这。路线是死的,人是活的,卡住了随时来问我。觉得有用就点个收藏,别让它进收藏夹吃灰——动起来比啥都强。