/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
@bit::Shadow
✧(≖ ◡ ≖✿
目录
定义聊天模型
Page2
Page3
本地部署 LLM 演示(32)
本文介绍LangChain中聊天模型的定义与使用,通过ChatOpenAI和ChatOllama实现本地及云端大模型调用。利用LCEL(LangChain Expression Language)的管道符|组合模型与解析器,实现消息流式处理与结果解析。支持配置化参数(如model、max_tokens),并通过configurable灵活切换模型与参数。结合Pydantic定义工具输入输出,提升可读性与安全性。最后演示本地部署LLM(如Ollama)的调用方式,适用于私有化场景。
Runnable 接口: 提供一套统一、可组合、支持同步/异步/流式/批量的标准接口,让不同组件能像「乐高积木」一样用管道符 | 拼装成链。
LCEL:编排解决方案
.py
model = ChatOpenAI(model="gpt-4o-mini")
#1.定义openai模型 默认从环境变量中获取key
messages = [
SystemMessage(content="你帮我翻译为英文"),
HumanMessage(content="具体内容")
]
#注意:context本是上下文“角色content译”内容
#2.定义消息
#系统提示消息 SystemMessage “通常作为第一条消息传入”
#用户消息 HumanMessage
tempresult = model.invoke(messages)
print(tempresult) # ①
#3.调用大模型
# 输入的是LangChain消息列表
# 输出的是 LangChain 消息(AIMessage)
parser = StrOutputParser()
#4.定义"解析器"
chain = model | parser
print(chain.invoke(messages)) # ②
#model.invoke后将result交给parser
#的输出差异看出解析器的…作用
红笔批注:| 管道符,LangChain 消息到文本,输出的是 LangChain 消息 (AIMessage)
上述其实就是 LCEL(LangChain Expression Language):采用声明性方法从现有的 Runnable对象构建新的 Runnable对象。
定义聊天模型
model = ChatOpenAI(
model="gpt-4o-mini",
temperature = 0, #温度,越大,内容越发散,常 [0,2]或[0,1]
max_tokens = None, #输出最大token
timeout = None,
max_retries =2,
api_key="…",
base_url="…", #指定前置请求路径,理解:我们直接访问
organization="…", #openai组织ID
# other prag…
)
base_url:
deepseek:api.deepseek.com 出于兼容 openai,也可写为 https://api.deepseek.com/v1
2.init_chat_model
2.1 基础使用
gpt_model = init_chat_model(
model="gpt-4o-mini",
model_provider="openai",
temperature=0.3,
# 其他常用可选参数:
# max_tokens=1024,
# timeout=30,
# max_retries=2,
# api_key="sk-…", # 或从环境变量 OPENAI_API_KEY 读取
# base_url="https://…", # 自定义代理/网关时使用
)
2.2 invoke() 的config参数才真正意义上定义了模型
print(
f"config-model: {
config_model.invoke(
input=messages,
config={"configurable": {"model": "deepseek-chat"}}
).content
}"
)
2.3 # 可配置 (configurable) 模型
config_model = init_chat_model(
model = "gpt-4o-mini",
model_provider="openai",
temperature=0.3,
)
Page2
第二种定义 docxstring 的方式:pydantic 方法
class AddInput(BaseModel):
"""两数相加"""
a:int = Field(…, description="第一个整数") #…表示该字段必填,无默认值
b:int = Field(…, description="第二个整数")
@tool(args_schema = AddInput)
def add(a:int,b:int)->int:
return a+b
注意:第二种定义方式较第一种add.args拥有描述字段
第三种(对第一种的修订)pydantic 方法
@tool
def Add(
a: Annotated[int, …,"第一个整数"],
b: Annotated[int, …,"第二个整数"],
)->int:
"""两数相加
Args:
a:第一个整数
b:第二个整数
"""
return a+b
Page3
max_tokens = 1024,
configurable_fields = ("max_tokens", "model", "model_provider"),
config_prefix="first", #配置前缀字段
messages = [
SystemMessage(content="需求…"),
HumanMessage(content="具体需求…")
]
result = model.invoke(
input=messages,
config = { #二次配置
"configurable":{
"first_max-tokens": 10,
"first_model": "deepseek-chat",
"first_model_provider": "deepseek",
}
}
)
本地部署 LLM 演示(32)
Ollama-model 与 openai-gpt 一致的方法,不过要使用 “本地”
ollama_model = ChatOllama(
model="deepseek-r1:1.5b",
base_url="http://127.0.0.1:[端口号]", # 换成 Ollama 实际端口,默认 11434
)
# 注:代理影响 —— 若系统设置了 HTTP_PROXY / HTTPS_PROXY,
# 访问 127.0.0.1 的请求可能被代理拦截,建议临时绕过本地地址。
print(ollama_model.invoke("需求…").content)
欢迎关注,长期连载 感谢支持 

