一、模型调用
前置文件:
- models.py
- .env
1. 引入依赖
from models import get_chat
from langchain_core.messages import SystemMessage
from langchain_core.messages import HumanMessage
from langchain_core.prompts import SystemMessagePromptTemplate
from langchain_core.prompts import HumanMessagePromptTemplate
from langchain_core.prompts import ChatPromptTemplate
model = get_chat()
2. 模型调用
# 标准写法
messages = [HumanMessage(content="你是谁?")]
# 简写
messages = [("system","你是我的男友,你喜欢用温柔宠溺的语气说话,请使用这种风格跟我聊天。"),
("user","你是谁?")]
model.invoke(input=messages)
3. 提问
messages = [HumanMessage(content="新中国成立多少年?")]
可见模型无法获取当前时间进行推算。
接下来我们绑上时间函数的工具,看看结果如何
from datetime import datetime
def get_current_datetime():
"""
获取当前的日期和时间
"""
now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
return formatted_date
model_with_tools = model.bind_tools(tools=[get_current_datetime])
加上获取时间的工具后,模型仍然无法直接推算出多少年。可见模型本身是不能调工具的。
二、大语言模型
大语言模型的本质
- 输入一句话,输出一句话
模型可以调用外部工具(函数)吗?
- 不能!
模型很聪明,虽然它自己不能调用函数,但是它能很好的判断是否需要调函数。
- 调用哪个函数?
- 需要什么参数?
如果需要调用函数,获取相关结果,则需要使用代理模式。
- 动作代理
- Agent
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(model=model,tools=[get_current_datetime])
results = agent.invoke(input={"messages":messages})
for msg in results["messages"]:
msg.pretty_print()
Agent 的技术本质
人工智能的本质 y = F(x)
agent 做的事都不应该是大模型做的事。
agent 是个工程调度问题,我们把很多的外部能力封装成 tool ,交给大模型参考。
大模型站在大脑的视角,可以灵活调度这些外部工具。
大模型只负责判断什么时候该调用什么工具,以及参数是什么。具体的调用是通过外部代理实现。
大模型不负责具体的调用,动作代理负责配合大模型来调用。
动作代理接收大模型的调用指示,完成调用动作,并把结果返给大模型。
ReAct:Reason + Action
- 推理 + 执行 :先思考,再执行
- 反复推理 + 执行,直至完成
Step By Step 一步一步解决问题
CoT : Chain of Thought 思维链,思考的过程
让大模型参考用户提供的工具来回答问题
def get_apple_price(model):
"""
查询苹果手机的价格,
入参:model 为型号,是一个字符串。取值为:‘7s’,‘xs‘,’13pro‘,’14pro‘,’15pro‘等
返参:单位为美元
"""
if model == "7s":
return 999
elif model == "xs":
return 1499
elif mode == "13pro":
return 2000
def money_exchange(amount):
"""
实现美元兑换人民币功能
请注意:
1. 入参是一个浮点数,单位是美元。
2. 返参也是一个浮点数,是转换后的人民币
"""
return amount * 7.32
agent = create_react_agent(model=model,
tools=[get_apple_price, get_current_datetime,money_exchange])
results = agent.invoke(input={"messages":[("user","7s多少人民币?")]})
agent 绑定的工具,是优先于自己内部的知识
注意事项
在 doc string 中写明:
- 函数的功能是什么?
- 入参是什么?类型?距离?
- 返参是什么?类型?单位?
- 可以写的长一点,清晰一些,无歧义,善用举例。
定义工具函数的名称,要见名知意,让大模型一看名称就知道要实现什么功能
LangGraph ,也叫 workflow(工作流),其实也是以前的 State Machine(状态机)