赞
踩
Agent代理的核心思想是使用语言模型来选择要采取的一系列动作。在链中,动作序列是硬编码的。在代理中,语言模型用作推理引擎来确定要采取哪些动作以及按什么顺序进行。
因此,在LangChain中,Agent代理就是使用语言模型作为推理引擎,让模型自主判断、调用工具和决定下一步行动。
Agent代理像是一个多功能接口,能够使用多种工具,并根据用户输入决定调用哪些工具,同时能够将一个工具的输出数据作为另一个工具的输入数据。
根据几个维度对所有可用的代理进行分类:
模型类型:代理适用于那类模型。Chat(接收消息,输出消息)、LLM(接收字符串,输出字符串)
聊天历史: 代理是否支持聊天历史。如果支持,这意味着它可以用作聊天机器人。如果不支持,那么它更适合单一任务。
多输入工具: 代理是否支持具有多个输入的工具。如果一个工具只需要单个输入,那么LLM通常更容易知道如何调用它。
并行函数调用: 让LLM同时调用多个工具可以大大提高代理的效率
所需模型参数: 代理是否需要模型支持任何其他参数。某些代理类型利用了OpenAI 函数调用等功能,这些功能需要其他模型参数。如果不需要,则意味着一切都通过提示完成
代理名称 | 模型类型 | 聊天历史 | 多输入工具 | 并行函数调用 | 所需模型参数 | 描述 | Agent |
---|---|---|---|---|---|---|---|
OpenAI tools | Chat | √ | √ | √ | tools | OpenAI将调用单个函数的能力称为 函数,将调用一个或多个函数的能力称为工具。 | create_openai_tools_agent |
OpenAI functions | Chat | √ | √ | x | functions | 使用Op0nAl函数集合的代理。已弃用转而使用OpenAI tools | create_openai_functions_agent |
XML Agent | LLM | √ | x | x | 某些语言模型(例如 Anthropic 的 Claude)特别擅长推理/编写 XML。 | create_xml_agent | |
Structured chat | Chat | √ | √ | x | 使用结构化工具集的代理 | create_structured_chat_agent | |
JSON Chat Agent | Chat | √ | x | x | 代理使用 JSON 来格式化其输出,旨在支持聊天模型。 | create_json_chat_agent | |
ReAct | LLM | √ | x | x | 推理和执行,推理后决定调用工具或者根据工具返回结果确定完成任务 | create_react_agent | |
Self-ask with search | LLM | x | x | x | 通过追问和中间答案,引导发现最终答案 | create_self_ask_with_search_agent |
构建一个具有两种工具的代理:一种用于在线查找,另一种用于查找加载到索引中的特定数据。
在LangChain中有一个内置的工具,可以方便地使用Tavily搜索引擎作为工具。
访问[Tavily](用于在线搜索)注册账号并登录,获取API 密钥
设置OpenAI和TAVILY的API密钥
import os
os.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c99B378Bxxxxxxxxxxxxxxxx13bc437B82c2"
os.environ["TAVILY_API_KEY"] = 'tvly-Scx77cTxxxxxxxxxxxxx3rmxRIM8'
首先需要创建想要使用的工具。这里使用两个工具:
Tavily(用于在线搜索)
创建的本地索引的检索器
# 加载所需的库
from langchain_community.tools.tavily_search import TavilySearchResults
# 查询 Tavily 搜索 API 并返回 json 的工具
search = TavilySearchResults()
# 执行查询
res = search.invoke("目前市场上苹果手机15的平均售价是多少?")
print(res)
执行查询结果如下:
根据上述查询结果中的某个URL中,获取一些数据创建一个检索器。
这里使用一个简单的本地向量库FAISS,使用FAISS的CPU版本,需要安装FAISS库:
pip install faiss-cpu
from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from langchain_text_splitters import RecursiveCharacterTextSplitter # 加载HTML内容为一个文档对象 loader = WebBaseLoader("https://www.ithome.com/0/718/713.htm") docs = loader.load() # 分割文档 documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs) # 向量化 vector = FAISS.from_documents(documents, OpenAIEmbeddings()) # 创建检索器 retriever = vector.as_retriever() # 测试检索结果 print(retriever.get_relevant_documents("iPhone 15平均销售价格是多少?")[1])
检索结果如下:
from langchain.tools.retriever import create_retriever_tool
# 创建一个工具来检索文档
retriever_tool = create_retriever_tool(
retriever,
"iPhone_price_search",
"搜索有关 iPhone 15 的价格信息。对于iPhone 15的任何问题,您必须使用此工具!",
)
# 创建将在下游使用的工具列表
tools = [search, retriever_tool]
选择将驱动代理的LLM,为了模型回答更严谨,设置temperature=0
from langchain_openai import ChatOpenAI
# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
这里使用LangChain中一个叫OpenAI functions的代理,然后得到一个AgentExecutor代理执行器。
AgentExecutor是代理执行器,它实际上调用代理,执行其选择的操作,将操作输出传回代理,然后重复。
from langchain import hub # 获取要使用的提示 prompt = hub.pull("hwchase17/openai-functions-agent") # 打印Prompt print(prompt) # 使用OpenAI functions代理 from langchain.agents import create_openai_functions_agent # 构建OpenAI函数代理:使用 LLM、提示模板和工具来初始化代理 agent = create_openai_functions_agent(llm, tools, prompt) from langchain.agents import AgentExecutor # 将代理与AgentExecutor工具结合起来 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
注意:目前这些都是无状态查询
# 执行代理
agent_executor.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价??"})
执行部分日志记录如下:
> Entering new AgentExecutor chain... Invoking: `iPhone_price_search` with `{'query': 'iPhone 15 average selling price'}` 苹果 iPhone 15/Pro系列国行价格出炉,5999 元起 - IT之家 根据搜索结果,苹果 iPhone 15 系列的国行价格从 5999 元起售。如果您想在此基础上加价5%,您可以按照以下方式定价: - iPhone 15:5999 元 + 5% = 6298.95 元 - iPhone 15 Plus:6999 元 + 5% = 7348.95 元 - iPhone 15 Pro:7999 元 + 5% = 8398.95 元 - iPhone 15 Pro Max:9999 元 + 5% = 10498.95 元 您可以根据以上价格定价出售您的苹果手机 15 系列产品。希望这可以帮助到您! > Finished chain.
目前代理是无状态的,这意味着它不记得以前的交互。为了给它记忆,需要传入chat_history
。
注意:
chat_history
是正在使用提示符中的一个变量,因此需要调用它。如果使用不同的提示,可能需要更改变量名称
具体Prompt提示模板内容如下: 记忆测试:
# 加载所需的库 from langchain_community.tools.tavily_search import TavilySearchResults # 查询 Tavily 搜索 API 并返回 json 的工具 search = TavilySearchResults() # 创建将在下游使用的工具列表 tools = [search] from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) from langchain import hub # 获取要使用的提示 prompt = hub.pull("hwchase17/openai-functions-agent") # 使用OpenAI functions代理 from langchain.agents import create_openai_functions_agent # 创建使用 OpenAI 函数调用的代理 agent = create_openai_functions_agent(llm, tools, prompt) from langchain.agents import AgentExecutor # 得到代理工具执行器 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 执行代理 # 传入一个空的消息列表给chat_history,因为它是聊天中的第一条消息 res = agent_executor.invoke({"input": "hi! my name is bob", "chat_history": []}) print(res) from langchain_core.messages import AIMessage, HumanMessage agent_executor.invoke( { "chat_history": [ HumanMessage(content=res['input']), AIMessage(content=res['output']), ], "input": "what's my name?", } )
执行日志如下,代理明显有了记忆
> Entering new AgentExecutor chain...
Hello Bob! How can I assist you today?
> Finished chain.
{'input': 'hi! my name is bob', 'chat_history': [], 'output': 'Hello Bob! How can I assist you today?'}
> Entering new AgentExecutor chain...
Your name is Bob! How can I assist you today, Bob?
> Finished chain.
自动跟踪这些消息,可以将其包装在RunnableWithMessageHistory中
from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.runnables.history import RunnableWithMessageHistory message_history = ChatMessageHistory() agent_with_chat_history = RunnableWithMessageHistory( agent_executor, lambda session_id: message_history, input_messages_key="input", history_messages_key="chat_history", ) agent_with_chat_history.invoke( {"input": "hi! I'm bob"}, config={"configurable": {"session_id": "<foo>"}}, ) agent_with_chat_history.invoke( {"input": "what's my name?"}, config={"configurable": {"session_id": "<foo>"}}, )
执行日志如下:
> Entering new AgentExecutor chain...
Hello Bob! How can I assist you today?
> Finished chain.
> Entering new AgentExecutor chain...
Your name is Bob! How can I assist you, Bob?
> Finished chain.
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。
L1级别:AI大模型时代的华丽登场
L2级别:AI大模型API应用开发工程
L3级别:大模型应用架构进阶实践
L4级别:大模型微调与私有化部署
一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。
以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。