@bit::Shadow
✧(≖ ◡ ≖✿
目录
[本地部署 LLM 演示(32)](#本地部署 LLM 演示(32))
本文介绍LangChain中聊天模型的定义与使用,通过ChatOpenAI和ChatOllama实现本地及云端大模型调用。利用LCEL(LangChain Expression Language)的管道符|组合模型与解析器,实现消息流式处理与结果解析。支持配置化参数(如model、max_tokens),并通过configurable灵活切换模型与参数。结合Pydantic定义工具输入输出,提升可读性与安全性。最后演示本地部署LLM(如Ollama)的调用方式,适用于私有化场景。
Runnable 接口: 提供一套统一、可组合、支持同步/异步/流式/批量 的标准接口,让不同组件能像「乐高积木」一样用管道符 | 拼装成链。
LCEL:编排解决方案
.py
python
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对象。
定义聊天模型
python
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 基础使用
python
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参数才真正意义上定义了模型
python
print(
f"config-model: {
config_model.invoke(
input=messages,
config={"configurable": {"model": "deepseek-chat"}}
).content
}"
)
2.3 # 可配置 (configurable) 模型
python
config_model = init_chat_model(
model = "gpt-4o-mini",
model_provider="openai",
temperature=0.3,
)
Page2
第二种定义 docxstring 的方式:pydantic 方法
python
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 方法
python
@tool
def Add(
a: Annotated[int, ...,"第一个整数"],
b: Annotated[int, ...,"第二个整数"],
)->int:
"""两数相加
Args:
a:第一个整数
b:第二个整数
"""
return a+b
Page3
python
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 一致的方法,不过要使用 "本地"
python
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)
欢迎关注,长期连载
感谢支持
