0、概述
根据知识的生命周期分类,我们通常会采取不同的方法(微调、RAG、Agent)来将知识融入到AI中
0.1 长生命周期知识
这类知识通常具有较高的稳定性和通用性,不会因时间的推移而轻易改变。它们是知识体系中的“基石”,在较长时间内保持有效性和价值。
特点:
- 稳定性强:如数学定理、物理公式等,这些知识经过长期验证,具有高度的确定性和普适性
- 基础性强:往往是学习和研究其他知识的基础,例如教科书中的基础知识
- 更新缓慢:即使有更新,也是在原有框架上的微调或扩展,而不是完全推翻
应用场景:
- 教育领域:教科书、学术著作等
- 科学研究:基础理论、经典模型等
- 技术领域:如编程语言的基本语法、经典算法等
处理方法:
- 微调和注入模型:在人工智能领域,长生命周期知识可以作为预训练模型的基础,通过微调(fine-tuning)来适应特定任务。例如,BERT模型在自然语言处理中被广泛使用,其基础架构和预训练知识是长生命周期的,但可以通过注入特定领域的数据进行微调
0.2 固定期限知识
这类知识具有明确的时间限制,通常与特定的政策、法规、产品或项目相关,它们在特定时间段内有效,但随着时间推移或政策变化,可能需要更新或失效
特点:
- 时效性强:如2024年的报销规定,仅在该年度有效,之后需要根据新规定调整
- 针对性强:通常针对特定领域或场景,如特定产品的使用说明或行业标准
- 更新频繁:随着政策、技术或市场需求的变化,这类知识需要定期更新
应用场景:
- 政策法规:如税务政策、行业标准等
- 产品信息:如软件版本说明、产品手册等
- 企业内部知识:如公司内部的报销流程、项目文档等
处理方法:
- RAG(Retrieval-Augmented Generation):这是一种结合检索和生成的模型架构,适用于处理固定期限的知识。通过检索最新的相关信息,结合生成模型,可以快速提供符合当前要求的答案。例如,在回答关于最新法规的问题时,RAG可以通过检索最新的法规条文来生成准确的回答
0.3 实时信息
这类知识具有极高的时效性,通常需要即时获取和处理,它们反映了最新的动态、事件或数据,对实时性要求极高
特点:
- 动态性强:内容可能每时每刻都在变化,如股票价格、天气信息等
- 交互性强:通常需要实时反馈和交互,例如用户与智能助手的对话
- 依赖数据源:需要可靠的数据源来提供最新的信息
应用场景:
- 智能助手:如ChatGPT、Kimi等,能够实时回答用户的问题
- 金融领域:实时股票交易系统、外汇汇率查询等
- 物联网:实时监控设备状态、环境数据等
处理方法:
- Agent(智能代理):Agent是一种能够自主感知环境并做出决策的智能系统。它可以根据实时信息做出快速反应,例如智能家居系统中的智能代理可以根据实时环境数据调整设备状态
1、Agent基础知识
1.1 定义
大语言模型本身无法直接调用外部工具或函数,但可以通过代理模式(Agent)来实现工具调用,代理模式的核心在于将语言模型的推理能力和外部工具的执行能力结合起来,通过中间的代理(Agent)来管理工具调用的流程,通过代理模式,语言模型可以间接调用外部工具,从而扩展其功能,更好地完成复杂任务
例如,ReAct框架是一种常见的代理模式,它通过“推理(Reason)+行动(Act)”的方式,让语言模型在推理过程中判断是否需要调用外部工具,并生成相应的行动指令
此外,LangChain等工具也提供了类似的代理机制,允许语言模型通过定义好的工具接口来调用外部功能
在Agent模式下,语言模型需要明确以下几点:
是否需要调用外部工具:语言模型需要根据输入判断是否需要外部工具的支持(在外部工具中,建议写好详细的代码注释,方便模型判断是否对其进行调用)
调用哪个工具:根据任务需求选择合适的工具
需要什么参数:为工具提供必要的输入参数
1.2 技术本质
Agent 技术的本质是y = F(x)
- 输入(x):用户的原始问题或任务
- 输出(y):最终的解决方案或结果
- 函数(F):Agent 技术的核心,通过语言模型和外部工具的协同作用,将输入转化为输出
Agent系统的组成:
- model:一个大模型 --> 做决策大脑
- tools:一些列工具 --> 做能力拓展(专长)
- create_react_agent:创建一个 agent
1.3 核心概念
封装外部能力为工具(Tool):
将各种外部功能(如搜索、API 调用、数据库查询等)封装成工具(Tool)
这些工具可以被语言模型灵活调用,扩展其能力边界
大模型的角色:
大脑(Brain):大模型负责理解任务、推理逻辑,并判断何时需要调用外部工具
工具调度:大模型决定调用哪个工具以及提供什么参数,但不直接执行调用
动作代理(Action Agent):
执行者(Executor):动作代理接收大模型的调用指示,完成具体的工具调用动作
结果返回:将工具的执行结果反馈给大模型,供其进一步处理
1.4 工作流程
ReAct(Reason + Action):
Reason(推理):大模型根据输入问题进行逻辑推理,判断是否需要调用外部工具
Action(执行):如果需要调用工具,大模型生成调用指令,动作代理执行工具调用
循环:推理 + 执行,逐步解决问题,直至完成
Step-by-Step(逐步解决问题):
将复杂问题分解为多个小步骤,每一步可能涉及推理和工具调用
通过逐步解决每个小问题,最终完成整个任务
CoT(Chain of Thought,思维链):
思考过程的显式表达:大模型不仅输出最终结果,还展示推理过程,帮助用户理解解决问题的逻辑
增强可解释性:通过思维链,用户可以更好地理解模型的决策路径
2、Agent示例
先做模型准备(注意在代码工作目录下新建.env文件,填写对应的环境变量,如DASHSCOPE_API_KEY)
from dotenv import load_dotenv
load_dotenv()
from langchain_community.chat_models import ChatTongyi
def get_chat():
return ChatTongyi(model="qwen-turbo", temperature=0.1, top_p=0.7)
2.1 模型直接调用
2.1.1 常规调用
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()
"""
与模型进行常规对话,发现模型表现良好
"""
# 标准写法
message1 = [HumanMessage(content="你是谁?")]
result1 = model.invoke(input=message1)
print(f"不加提示词的你是谁:\n{result1}\n--------")
# 简写
message2 = [("system", "你是我的女朋友,你喜欢嗲声嗲气的说话,请使用这种风格跟我聊天"),
("user", "你是谁?")]
result2 = model.invoke(input=message2)
print(f"加提示词的你是谁:\n{result2}\n--------")
结果:
2.1.2 包含实时信息的调用
"""
提一些包含实时信息的其他问题,发现模型无法给到满意的结果
"""
message3 = [HumanMessage(content="美国建国多少年了?")]
result3 = model.invoke(input=message3)
print(f"美国建国时间:\n{result3}\n--------")
结果:
2.2 模型绑定工具后的调用
"""
获取当前时间的工具
"""
from datetime import datetime
def get_current_datetime() -> str:
"""
获取当前的日期和时间
"""
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])
print(f"看看原始模型长什么样子:\n{model}\n--------")
print(f"再看看绑定工具之后的模型长什么样子:\n{model_with_tools}\n--------")
result4 = model_with_tools.invoke(input=message3)
print(f"美国建国时间(绑定工具之前):\n{result3}\n--------")
print(f"美国建国时间(直接绑定工具之后):\n{result4}\n--------")
# 方法二:用Agent来绑定(效果良好,可以得到最终结果)
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(model=model, tools=[get_current_datetime])
result5 = agent.invoke(input={"messages": message3})
print(f"美国建国时间(Agent绑定工具之后):")
for msg in result5["messages"]:
msg.pretty_print()
结果:
2.3 tool的进一步绑定与使用
from langchain.agents import tool
"""
在 doc string 中:
- 函数的功能是什么?
- 入参是什么?类型?举例?
- 返参是什么?类型?单位?
-- 可以写的长一点,清晰一些,明了一些!尽量无歧义,善用举例子!!!
"""
# tool 是给大模型赋能的(不是给人看的,是给大模型看的)
@tool
def get_apple_price(model: str) -> str:
"""
查询苹果手机的价格!
入参:model 为型号,是一个字符串!取值为:'4s', '5s', '6s' 等苹果的具体型号!
返参:一个字符串,代表相应的价格!
"""
if model == "4s":
return "4000美元"
elif model == "5s":
return "5000人民币"
elif model == "6s":
return "6000人民币"
@tool
def money_exchange(amount):
"""
实现美元兑换人民币功能!
请注意:
1. 入参是一个证书,单位是美元!
2. 返参也是一个整数,是转换后的人民币!
"""
return amount * 2
# 绑定tool到model
agent = create_react_agent(model=model, tools=[get_apple_price,
get_current_datetime,
money_exchange])
# 获取模型响应结果
results = agent.invoke(input={"messages":[("user", "我10号发工资,工资为2000美元,今天是几号,我能买得起一部6S吗?")]})
# 打印结果
for msg in results["messages"]:
msg.pretty_print()
结果: