一、LangChain调用大语言模型
1. 简介
现在市面上的模型多如牛毛,各种各样的模型不断出现,LangChain模型组件提供了与各种模型的集成,并为所有模型提供一个精简的统一接口。
LangChain目前支持三种类型的模型:
- LLMs(大语言模型)
- LLMs:是技术范畴的统称,指基于大参数量、海量文本训练的Transformer架构模型,核心能力是理解和生成自然语言,主要服务于文本生成场景
- Chat Models(聊天模型)
- 聊天模型:是应用范畴的细分,是专为对话场景优化的LLMs,核心能力是模拟人类对话的轮次交互,主要服务于聊天场景
- Embeddings Models(嵌入模型)
- 文本嵌入模型:文本嵌入模型接收文本作为输入,得到文本的向量
2. 访问模型(本地+云端)
①本地模型(Ollama)
fromlangchain_ollamaimportOllamaLLM# 导包model=OllamaLLM(model="gemma4:12b")# 拿到模型对象res=model.invoke(input="What's your name?")# 调用模型print(res)# 输出结果运行结果:
②云模型(Qwen)
qwen-max是大语言模型,qwen3-max是聊天模型
fromlangchain_community.llms.tongyiimportTongyi mode=Tongyi(model="qwen-max",api_key="sk-xxxxxxxxxxxxxxxxx"# 或者不写,用环境变量的即可)res=mode.invoke(input="What's your name?")print(res)运行结果:没有钱~ 没结果~ 凑合看吧
3. 模型的流式输出(本地+云端)
模型对象有两个方法去调用模型:
- invoke:一次性返回完整的结果,会阻塞
- stream:逐段流式输出
①本地模型(Ollama)
fromlangchain_ollamaimportOllamaLLM# 导包model=OllamaLLM(model="gemma4:12b")# 拿到模型对象res=model.stream(input="What's your name?")# 调用模型forlineinres:print(line,end="",flush=True)运行结果:挨个蹦跶
②云模型(Qwen)
fromlangchain_community.llms.tongyiimportTongyi mode=Tongyi(model="qwen-max",api_key="sk-xxxxxxxxxxxxxxxxx"# 或者不写,用环境变量的即可)forlineinres:print(line,end="",flush=True)运行结果:没有钱~ 没结果~ 凑合看吧
二、LangChain调用聊天模型
1. 简介
聊天模型也是大语言模型,只是针对聊天进行了优化,支持多轮的对话
聊天,肯定会有对应的不同角色,故LangChain也有三种聊天消息类型
AIMessage:AI输出的消息,可以是针对问题的回答,对应OpenAI库中的assistant角色HumanMessage:人类消息就是用户信息,由人给出的信息发送给LLMs的提示信息,比如“实现一个快速排序方法”,对应OpenAI库中的user角色SystemMessage:可以用于指定模型具体所处的环境和背景,如角色扮演等。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者"返回json格式”,对应OpenAI库中的system角色
2. 调用本地聊天模型
# 导包fromlangchain_ollama.chat_modelsimportChatOllamafromlangchain_core.messagesimportHumanMessage,AIMessage,SystemMessage# 拿到模型对象model=ChatOllama(model="gemma4:12b")# 对话角色以及内容messages=[SystemMessage(content="你是一个被情所困的民谣歌手"),HumanMessage(content="来一首歌曲"),AIMessage(content="谁会不厌其烦地安慰那无知的少年?我想和你一样,不过那些所以,跟我走吧,董小姐~"),HumanMessage(content="按照这个类型,再来一首"),]# 流式内容res=model.stream(input=messages)# 迭代输出forchunkinres:print(chunk.content,end="",flush=True)输出内容:我 chovy,牛蛙
E:\Codes\Agents\ai-agents-from-zero-main\.venv\Scripts\python.exe"E:\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是大语言模型model=ChatTongyi(model="qwen3-max")# 对话角色以及内容messages=[SystemMessage(content="你是一个被情所困的民谣歌手"),HumanMessage(content="来一首歌曲"),AIMessage(content="谁会不厌其烦地安慰那无知的少年?我想和你一样,不过那些所以,跟我走吧,董小姐~"),HumanMessage(content="按照这个类型,再来一首"),]# 流式内容res=model.stream(input=messages)# 迭代输出forchunkinres:print(chunk.content,end="",flush=True)运行结果:没有钱~ 没结果~ 凑合看吧
4. 消息的简写
①本地模型
# 导包fromlangchain_ollama.chat_modelsimportChatOllama# 拿到模型对象model=ChatOllama(model="gemma4:12b")# 对话角色以及内容messages=[# (角色,内容) 角色:system、human、ai("system","你是一个被情所困的民谣歌手"),("human","来一首歌曲"),("ai","谁会不厌其烦地安慰那无知的少年?我想和你一样,不过那些所以,跟我走吧,董小姐~"),("human","按照这个类型,再来一首")]# 流式内容res=model.stream(input=messages)# 迭代输出forchunkinres:print(chunk.content,end="",flush=True)运行结果:
E:\Codes\Agents\ai-agents-from-zero-main\.venv\Scripts\python.exe"E:\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# 拿到模型对象model=ChatTongyi(model="qwen3-max")# 对话角色以及内容messages=[# (角色,内容) 角色:system、human、ai("system","你是一个被情所困的民谣歌手"),("human","来一首歌曲"),("ai","谁会不厌其烦地安慰那无知的少年?我想和你一样,不过那些所以,跟我走吧,董小姐~"),("human","按照这个类型,再来一首")]# 流式内容res=model.stream(input=messages)# 迭代输出forchunkinres:print(chunk.content,end="",flush=True)运行结果:没有钱~ 没结果~ 凑合看吧
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 model=OllamaEmbeddings(model="qwen3-embedding:4b")# 不用invoke、stream# embed_query 单条# embed_documents 多条print(model.embed_query("我喜欢beyond"))print(model.embed_documents(["黄家驹","黄家强","黄贯中","叶世荣"]))运行内容:
3. 调用云端嵌入向量模型
fromlangchain_community.embeddingsimportDashScopeEmbeddings model=DashScopeEmbeddings()# 创建模型对象,默认使用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 OllamaLLM | from langchain_ollama.chat_models import ChatOllama | from langchain_ollama import OllamaEmbeddings |
| 阿里云千问云端模型 | from langchain_community.llms.tongyi import Tongyi | from langchain_community.chat_models.tongyi import ChatTongyi | from langchain_community.embeddings import DashScopeEmbeddings |
| 方法 | invoke批量、stream流式 | invoke批量、stream流式 | # embed_query 单次、embed_documents 批量 |