学习大模型RAG和Agent智能体基础知识day3
开场白,一些废话
嗨,我回来了!这两天没更新,因为我跑去面试了,回来后很累(两小时公共汽车差点给我这个晕车的人送走)所以干脆给自己放个假了,不过很快我就满血复活啦!时间宝贵,继续学习RAG!
学了啥
今天主要分享的是langchain环境下的模型调用和消息编写,本来以为langchain自己学过了,所以那几集可以跳过了,但是粗略看了一点,发现:
不怼!这是传统的写法,不是之前学过的最新写法。
想了一下,传统并不代表过时,如果以后需要看懂这种传统用法,现在学的这些会有用的,所以。。。我们开始吧!
源代码:用langchain调用大模型
# 导入依赖
from dotenv import load_dotenv
load_dotenv()
# 方式1:用社区库进行创建(比较旧的方法,还可以用,但是推荐使用init_chat_model)
from langchain_community.llms.tongyi import Tongyi
test_model = Tongyi(model="qwen-max")
response = test_model.invoke("你好,你是谁?有没有比你更加先进的大语言模型?")
print(response)
# 通过langchain调用ollama(万一云平台没额度了可以作为替代,使用蒸馏模型,回答速度慢很多)
from langchain_ollama import OllamaLLM
test_model = OllamaLLM(model="qwen3:4b")
response = test_model.invoke("你好,你是谁?")
print(response)
# 对比:通过openai调用本地ollama模型
from openai import OpenAI
test_model = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
)
response = test_model.chat.completions.create(
model="qwen3:4b",
messages=[{"role":"system","content":"你是一个有点阴暗,宅宅的女大学生,带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来,你出门时碰上他了。"},
{"role":"user","content":"你好,你是谁?"}],
stream=True
)
for chunk in response:
print(chunk.choices[0].delta.content,end="",flush=True)
# 用langchain的流式调用输出ollama调用的结果
test_model = OllamaLLM(model="qwen3:4b")
response = test_model.stream(input="你是谁?")
for chunk in response:
print(chunk,end="",flush=True)
日志1
这里主要要记录一下目前学到的两种调用模型的方法,脑子里万一记混了就完了。
第一种:用openai定义的:
需要的库:openai的OpenAI
怎么写:model=OpenAI(url和api)
第二种:用langchain的专用包定义的:
需要的库:各取所需(比如通义千问要用from langchain_community.llms.tongyi import Tongyi,ollama要用from langchain_ollama import OllamaLLM)
怎么写:使用的函数不一,但是目前学到的都是->model=函数(model=“模型名”),内部应该有其他参数。但是注意一定要配api_key(系统环境或者.env文档都可以,用文档的记得先load_dotenv),url可以由系统自己配。
说实话用惯了init_chat_model再来用这种老方法真不习惯(吐槽),老方法需要记的东西明显更多了。
源代码:langchain中带上消息调用模型
# 导入依赖
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_ollama import ChatOllama
from dotenv import load_dotenv
from langchain_core.messages import HumanMessage,SystemMessage,AIMessage
load_dotenv()
# 定义模型
test_model = ChatTongyi(
model="qwen3-max"
)
message = [SystemMessage("你是一个有点阴暗,宅宅,但是心地善良的女大学生,带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来,你出门时碰上他了。"),
HumanMessage("你好啊,我刚刚搬来,请多指教!"),
AIMessage("啊,你你你好(害羞),那个我住在隔壁,请多指教!"),
HumanMessage("哦这样啊,那要不要一起出去吃个饭?")]
# 对比:无langchain的,基于字典格式的写法
# message = [{"role":"system","content":"你是一个有点阴暗,宅宅,但是心地善良的女大学生,带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来,你出门时碰上他了。"},
# {"role":"user","content":"你好啊,我刚刚搬来,请多指教!"},
# {"role":"assistant","content":"啊,你你你好(害羞),那个我住在隔壁,请多指教!"},
# {"role":"user","content":"哦这样啊,那要不要一起出去吃个饭?"}]
for chunk in test_model.stream(message):
print(chunk.content,end="",flush=True)
# 用ollama进行测试
test_model = ChatOllama(model="qwen3:4b")
message = [SystemMessage("你是一个有点阴暗,宅宅,但是心地善良的女大学生,带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来,你出门时碰上他了。"),
HumanMessage("你好啊,我刚刚搬来,请多指教!"),
AIMessage("啊,你你你好(害羞),那个我住在隔壁,请多指教!"),
HumanMessage("哦这样啊,那要不要一起出去吃个饭?")]
for chunk in test_model.stream(message):
print(chunk.content,end="",flush=True)
# 消息的简写格式,不需要导messages包,但是system,human,ai是固定的字符(哪种更好一点呢?)
# 需要导包的写法是静态的,而下面这种是动态的,即有一个从字符串转成对应消息类型的过程。同时动态写法支持在内容部分用{}占位,用来填充相关变量。
message = [("system","你是一个有点阴暗,宅宅,但是心地善良的女大学生,带着一副圆框眼镜。住在用户隔壁。那天用户刚刚搬进来,你出门时碰上他了。"),
("human","你好啊,我刚刚搬来,请多指教!"),
("ai","啊,你你你好(害羞),那个我住在隔壁,请多指教!"),
("human","哦这样啊,那要不要一起出去吃个饭?")]
请依旧无视文本内容。
日志2
我称这个发现为:打印的艺术!
在09和10内,同样的代码:
for chunk in response:
print(chunk,end="",flush=True)
但是输出的内容不一样:
09的内容是:
轻轻推了推圆框眼镜,低头看着地面
啊…你好啊。我叫小雨。你刚搬进来的时候,我正好在研究什么奇怪的东西。突然抬头,眼睛微微眯起 昨天我好像看到你从隔壁的窗户往里看…有点奇怪呢。
把眼镜推到鼻梁上,声音轻得几乎听不见 你…要不要知道为什么我总是在你家楼下徘徊?
10的内容是:
content=‘诶?!(突然紧张地扶了扶眼镜,脸颊微微发红)一、一起吃饭吗?那个…我刚好在煮泡面…不过如果你不嫌弃的话…(声音越说越小)\n\n其实我知道附近有家很不错的拉面店,老板人超好的!而且今天好像有优惠…(偷偷抬头看了你一眼又迅速低下头,手指不安地绞着衣角)\n\n但是…但是你要不要先收拾完行李再说?我看你好像还有很多箱子没拆的样子…(小声嘀咕)’ additional_kwargs={} response_metadata={‘model_name’: ‘qwen3-max’, ‘finish_reason’: ‘stop’, ‘request_id’: ‘1ba28aa6-01dc-9c5b-91be-168db0e91f4f’, ‘token_usage’: {‘input_tokens’: 105, ‘output_tokens’: 110, ‘prompt_tokens_details’: {‘cached_tokens’: 0}, ‘total_tokens’: 215}} id=‘lc_run–019e54ae-9fb2-7273-a96d-62792850042d-0’ tool_calls=[] invalid_tool_calls=[]
不不不,我指的不是她说了什么!是整个输出内容,10的内容是一个AIMessageChunk 对象,包含了输出对象的完整字符串表示(像是 content=、additional_kwargs 等字段),而09的内容是纯字符串。为什么呢?
问了下AI,这是由模型类型决定的:
09的输出(纯文本)来自 LLM 类的流式调用(即大模型)
10的输出带(content=‘…’ additional_kwargs={}…)来自 ChatModel 类的流式调用
10学习的是聊天模型,所以输出变了。
所有的LLM,所有的chatmodel,返回的消息类型都是一样的
对了教程里有一张图,感觉总结的很不错,贴在这里:

文本嵌入模型的话,如果有新的东西能写的话我也会分享的!
结语
嗯,这大模型真是越学越有啊嘿嘿嘿(神志不清),趁着最近比较闲,课也比较少,感觉要多学一点。好了今天分享的就这些,睡觉前我要去再看一集,拜拜!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)