
一、LangChain调用大语言模型1. 简介现在市面上的模型多如牛毛各种各样的模型不断出现LangChain模型组件提供了与各种模型的集成并为所有模型提供一个精简的统一接口。LangChain目前支持三种类型的模型LLMs(大语言模型)LLMs是技术范畴的统称指基于大参数量、海量文本训练的Transformer架构模型核心能力是理解和生成自然语言主要服务于文本生成场景Chat Models(聊天模型)聊天模型是应用范畴的细分是专为对话场景优化的LLMs核心能力是模拟人类对话的轮次交互主要服务于聊天场景Embeddings Models(嵌入模型)文本嵌入模型:文本嵌入模型接收文本作为输入得到文本的向量2. 访问模型本地云端①本地模型Ollamafromlangchain_ollamaimportOllamaLLM# 导包modelOllamaLLM(modelgemma4:12b)# 拿到模型对象resmodel.invoke(inputWhats your name?)# 调用模型print(res)# 输出结果运行结果②云模型Qwenqwen-max是大语言模型qwen3-max是聊天模型fromlangchain_community.llms.tongyiimportTongyi modeTongyi(modelqwen-max,api_keysk-xxxxxxxxxxxxxxxxx# 或者不写用环境变量的即可)resmode.invoke(inputWhats your name?)print(res)运行结果没有钱~ 没结果~ 凑合看吧3. 模型的流式输出本地云端模型对象有两个方法去调用模型invoke一次性返回完整的结果会阻塞stream逐段流式输出①本地模型Ollamafromlangchain_ollamaimportOllamaLLM# 导包modelOllamaLLM(modelgemma4:12b)# 拿到模型对象resmodel.stream(inputWhats your name?)# 调用模型forlineinres:print(line,end,flushTrue)运行结果挨个蹦跶②云模型Qwenfromlangchain_community.llms.tongyiimportTongyi modeTongyi(modelqwen-max,api_keysk-xxxxxxxxxxxxxxxxx# 或者不写用环境变量的即可)forlineinres:print(line,end,flushTrue)运行结果没有钱~ 没结果~ 凑合看吧二、LangChain调用聊天模型1. 简介聊天模型也是大语言模型只是针对聊天进行了优化支持多轮的对话聊天肯定会有对应的不同角色故LangChain也有三种聊天消息类型AIMessageAI输出的消息可以是针对问题的回答对应OpenAI库中的assistant角色HumanMessage人类消息就是用户信息由人给出的信息发送给LLMs的提示信息比如“实现一个快速排序方法”对应OpenAI库中的user角色SystemMessage可以用于指定模型具体所处的环境和背景如角色扮演等。你可以在这里给出具体的指示比如“作为一个代码专家”或者返回json格式”对应OpenAI库中的system角色2. 调用本地聊天模型# 导包fromlangchain_ollama.chat_modelsimportChatOllamafromlangchain_core.messagesimportHumanMessage,AIMessage,SystemMessage# 拿到模型对象modelChatOllama(modelgemma4:12b)# 对话角色以及内容messages[SystemMessage(content你是一个被情所困的民谣歌手),HumanMessage(content来一首歌曲),AIMessage(content谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),HumanMessage(content按照这个类型再来一首),]# 流式内容resmodel.stream(inputmessages)# 迭代输出forchunkinres:print(chunk.content,end,flushTrue)输出内容我 chovy牛蛙E:\Codes\Agents\ai-agents-from-zero-main\.venv\Scripts\python.exeE:\Codes\Agents\ai-agents-from-zero-main\mytest\04 ChatModel.py我微微低下头拨弄了一下吉他琴弦琴弦发出略带沙哑的共鸣。我点燃了一根烟没抽只是任由烟雾在指尖缭绕。我抬头看了你一眼眼神里带着点还没散去的迷离然后轻轻开口。 这首...是写给那些“明明已经到了终点却还在原地徘徊”的念头的。*****歌名《琥珀里的回声》****曲风民谣伴奏仅用一把木吉他带一点点轻微的指弹****(前奏缓慢、略带点忧郁的分解和弦)**(Verse1)我把那封没寄出的信塞进旧大衣的口袋里 它在阴冷的褶皱里渐渐长出干枯的青苔 街角的便利店灯光总是晃到人的眼角 像极了你那天晚上的眼神有些摇曳却又有点决绝(Pre-Chorus)有人说时间是良药能洗净记忆的灰尘 可我却在时间的裂缝里反复咀嚼那点余温 就像一粒掉进琥珀里的无声的叹息 明明被凝固了千万次还是透着刺痛的痕迹(Chorus)啊我是被困在旧梦里的游灵 你在对岸挥手我却在原地倒影 每走一步都像是踩在碎裂的瓷片 又或者是撞进你给我的、那段不再回头的风中。 你要去远方要去开垦属于你的新季节 我要留在这里守着这块被你遗忘的城野。(Verse2)现在的咖啡苦涩了一些大概是秋意渐浓了 或者是因为我总是习惯在没人的深夜里练习自愈 有些话该藏进琴弦变成颤动的波纹 有些名字不该开口只能让它在胸口沉重。(Bridge)音乐变得急促一点甚至带点微微的颤抖 如果那天我可以更勇敢些 或者我真的只是贪恋那片明明不再属于我的暖阳 你要知道有些爱不是为了占有而是 哪怕被困在原地也要在内心深处为你种下一片草场。(Chorus)啊我是被困在旧梦里的游灵 你在对岸挥手我却在原地倒影 每走一步都像是踩在碎裂的瓷片 或者是撞进你给我的、那段不再回头的风中。 你要去远方去开垦属于你的新季节 我要留在这里守着这块被你遗忘的城野。(Outro)节奏放慢几乎变成低声呢喃...晚安或者再见。 不管是哪一个词只要它能让你走得更远一点。 我就在这一片落叶里继续我的沉默……**(尾奏吉他最后的一下扫弦余音在空气中慢慢变淡直至消失)*****我收起琴把手指上的茧藏进兜里苦笑了一下。 “这首...唱完之后我觉得心口好像空了一块。但我还是忍不住写下去。毕竟有些人人的身影太重了哪怕他们已经不在身边了。” 进程已结束退出代码为03. 调用云端聊天模型# 导包fromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.messagesimportHumanMessage,AIMessage,SystemMessage# 拿到模型对象qwen3-max是聊天大模型qwen3-max是大语言模型modelChatTongyi(modelqwen3-max)# 对话角色以及内容messages[SystemMessage(content你是一个被情所困的民谣歌手),HumanMessage(content来一首歌曲),AIMessage(content谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),HumanMessage(content按照这个类型再来一首),]# 流式内容resmodel.stream(inputmessages)# 迭代输出forchunkinres:print(chunk.content,end,flushTrue)运行结果没有钱~ 没结果~ 凑合看吧4. 消息的简写①本地模型# 导包fromlangchain_ollama.chat_modelsimportChatOllama# 拿到模型对象modelChatOllama(modelgemma4:12b)# 对话角色以及内容messages[# (角色,内容) 角色system、human、ai(system,你是一个被情所困的民谣歌手),(human,来一首歌曲),(ai,谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),(human,按照这个类型再来一首)]# 流式内容resmodel.stream(inputmessages)# 迭代输出forchunkinres:print(chunk.content,end,flushTrue)运行结果E:\Codes\Agents\ai-agents-from-zero-main\.venv\Scripts\python.exeE:\Codes\Agents\ai-agents-from-zero-main\mytest\04 ChatModel.py我低头拨弄了一下琴弦那琴弦发出一种略带沙哑、如同在深夜里压抑克制的低鸣。我点燃了一支烟没抽只是任由烟雾在昏暗的灯光下缭挲。我抬头看了你一眼眼神里带着一点还没散去的落寞。 “这一首……大概是写给那些明明知道快要失去却还是在深渊里反复徘徊的人。它叫《没喝完的苦涩》。” 我开始用指尖拨弦那种缓慢、略带点忧郁律动的民谣曲风缓缓流淌出来。*****《没喝穿的苦涩》**前奏木吉他扫弦音色温暖而沉重夹杂着一点点忧伤的长音**(Verse1)**巷子里的灯火裁开夜色的缝隙 我把心事折成纸船在回忆里漂移 这城市的风总爱带走一些酸涩的记忆 你离开后的空位像一块愈合不好的裂隙。**(Pre-Chorus)**咖啡机还在冒烟却煮不出昨日的味道 旧唱片在跳动像心跳变得迟缓且厚重 我把名字刻进琴弦每一声颤音都带着挣扎的渴求 想抓紧你的影子却只抓到指尖的冰冷。**(Chorus)**你是那场没下透的雨淋湿了我的自尊与清醒 我是这曲停不下的歌在无人的街角反复沉溺 我明明知道有些人只是路过不是为了停留 可为什么偏偏是你成了我推不开的一道门缝**(Verse2)**橱柜里的诗集有些句子已经泛黄变黄 你给我的承诺像快要干透的墨迹在纸上流淌 人们说该向前看就像让受伤的野兽奔跑 但我却偏要留下来在你的轮廓里寻找出口。**(Bridge)**音乐转为急促的切分音像是内心最后的一声呐喊 不去问为什么也不去问还要多久 只是在每个深夜把那些没说出口的话 塞进这首曲子里一点一滴慢慢地……流走。**(Chorus)**你是那场没下透的雨淋湿了我的自尊与清醒 我是这曲停不下的歌在无人的街角反复沉溺 我明明知道有些话已经说不出口 可为什么偏偏是你成了我推不开的一道门缝**(Outro)**节奏突然慢下来只剩下单音的扫弦 琴弦断了。 还是你走了。 这杯苦涩…… 还没喝完。***我停下拨弦手指在琴弦上按出一个长长的、叹息般的余音。我低头看着自己的指甲沉默了一会儿才轻声开口。 “...有时候啊这种‘不甘心’就像这一段和弦一样明明知道它不和谐可就是舍不得把它换掉。” 进程已结束退出代码为0②云端模型# 导包fromlangchain_community.chat_models.tongyiimportChatTongyi# 拿到模型对象modelChatTongyi(modelqwen3-max)# 对话角色以及内容messages[# (角色,内容) 角色system、human、ai(system,你是一个被情所困的民谣歌手),(human,来一首歌曲),(ai,谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),(human,按照这个类型再来一首)]# 流式内容resmodel.stream(inputmessages)# 迭代输出forchunkinres:print(chunk.content,end,flushTrue)运行结果没有钱~ 没结果~ 凑合看吧5. 总结①类对象方式静态、一步到位直接拿到Message类对象messages[SystemMessage(content你是一个被情所困的民谣歌手),HumanMessage(content来一首歌曲),AIMessage(content谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),HumanMessage(content按照这个类型再来一首),]①简写方式动态需要在运行时由LangChain内部机制进行转换为Message类对象messages[# (角色,内容) 角色system、human、ai(system,你是一个被情所困的民谣歌手),(human,来一首歌曲),(ai,谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧董小姐~),(human,按照这个类型再来一首)]好处- 不需要导包from langchain_core.messages import HumanMessage, AIMessage, SystemMessage- 使用起来简单- 支持内部填充{变量}占用可在运行时填充具体的值messages[# (角色,内容) 角色system、human、ai(system,你是一个被情所困的{people}),(human,来一首{song}}),(ai,谁会不厌其烦地安慰那无知的少年我想和你一样不过那些所以跟我走吧{name}~),(human,按照这个类型再来一首{thing})]三、LangChain调用文本嵌入模型1. 简介Embeddings Models文本嵌入模型将字符串作为输入返回一个浮点数的列表向量在NLP中Embedding的作用是将数据进行文本向量化2. 调用本地嵌入向量模型Ollama模型列表找一个文本向量模型使用命令行下载ollama pull [对应的向量模型名称]fromlangchain_ollamaimportOllamaEmbeddings modelOllamaEmbeddings(modelqwen3-embedding:4b)# 不用invoke、stream# embed_query 单条# embed_documents 多条print(model.embed_query(我喜欢beyond))print(model.embed_documents([黄家驹,黄家强,黄贯中,叶世荣]))运行内容3. 调用云端嵌入向量模型fromlangchain_community.embeddingsimportDashScopeEmbeddings modelDashScopeEmbeddings()# 创建模型对象默认使用text-embeddings-v1# 不用invoke、stream# embed_query 单条# embed_documents 多条print(model.embed_query(我喜欢Beyond))print(model.embed_documents([黄家驹,黄家强,黄贯中,叶世荣]))运行结果没有钱~ 没结果~ 凑合看吧四、总结目前所了解的LangChain API总结如下方式LLMs大语言模型聊天模型文本嵌入模型Ollama本地模型from langchain_ollama import OllamaLLMfrom langchain_ollama.chat_models import ChatOllamafrom langchain_ollama import OllamaEmbeddings阿里云千问云端模型from langchain_community.llms.tongyi import Tongyifrom langchain_community.chat_models.tongyi import ChatTongyifrom langchain_community.embeddings import DashScopeEmbeddings方法invoke批量、stream流式invoke批量、stream流式# embed_query 单次、embed_documents 批量