
掌握 Ai 代理:用 5 个简单步骤打造你的第一个 Linkedin 自动资料撷取器
Generated using Meta AI on WhatsApp
世界发展的速度真是疯狂。AI无处不在,撰写电子邮件、生成艺术作品,甚至编写完整的应用程序。这场变革的核心是大型语言模型 (LLMs),它们能够回答问题、总结书籍,甚至进行深入对话。但问题在于,LLMs虽然看起来聪明,但有其局限性。它们对过去的互动记忆不佳,无法自主采取行动,绝对不会在没有一点帮助的情况下预订航班或自动化你的工作流程。
这就是AI代理的用武之地。可以把它们想象成具有超能力的LLMs,配备了记忆、推理和与工具及API互动的能力。与传统的仅仅响应提示的AI不同,AI代理可以规划、做出决策,并真正完成任务。从自动化研究到管理工作流程,它们将改变我们的工作、创造甚至生活方式。未来不仅仅是AI回答问题,而是AI采取行动。
在这篇博客中,我们将深入构建一个简单的AI代理——一个只需输入姓名即可获取某人LinkedIn个人资料的代理。这将让你亲身体验AI代理的工作方式、它们如何与外部工具互动以及它们为何如此强大。到最后,你将拥有一个坚实的基础,以开始构建更高级的代理。让我们开始吧!
在我们开始构建代理之前,先花一点时间谈谈AI代理到底是什么以及我们为什么需要它们。
目前,LLMs在生成文本、总结报告甚至编写代码方面非常出色。但它们有一些严重的局限性,它们没有记忆,无法采取行动,超出响应提示的范围,并且在复杂的多步骤任务中表现不佳。你不会信任一个LLM独自研究一个主题、交叉检查来源,并将结果通过电子邮件发送给你。
如果我们仔细想想,LLM所做的只是预测用户查询响应中的下一个词。
要了解更多关于LLM如何工作的内容,我强烈推荐观看这个YouTube视频 — https://youtu.be/wjZofJX0v4M?si=DEzcRVyYAdqxDTo1
这就是AI代理的作用。可以把它们想象成不仅仅会说话,还会行动的LLMs。它们可以搜索网络、与API互动,并自动化工作流程,而无需持续的人类输入。它们不仅仅是回答问题,而是能够真正完成任务。
那么,AI代理究竟是什么?
一个AI代理是一个将大型语言模型与工具、记忆和推理能力结合的系统,能够自主规划、执行和完成任务。与仅仅响应查询的基本大型语言模型不同,AI代理可以采取实际行动,例如获取数据、调用API或自动化工作流程。
要真正理解AI代理是如何工作的,我们可以将其拆分为核心构建块:工具、记忆、环境、动作和观察。这些构成了代理超越仅仅回答问题并实际与世界互动的能力。
- 工具 🛠️ — 可以将这些视为代理的“手”。它们使代理能够做超出生成文本的事情——例如搜索网络、调用API,甚至发送电子邮件。没有工具,代理只是一个被困在聊天框中的大型语言模型。
- 记忆 🧠 — 这是将代理与普通大型语言模型区分开的地方。它可以记住过去的互动,回忆细节,并跟踪长时间的对话,使其感觉更智能。
- 环境 🌍 — 每个代理都在某种空间中操作,无论是互联网、数据库还是特定应用程序。它与这个环境互动以获取数据、分析信息,甚至控制事物。
- 动作 🎬 — 与典型的大型语言模型仅仅坐着等待提示不同,代理实际上执行操作。它可以浏览网站,从API中提取信息,甚至自动化工作流程。
- 观察 👀 — 在每次行动后,代理查看结果(即观察)并决定接下来要做什么。搜索是否返回了正确的数据?API响应是否有效?这个反馈循环帮助它实时学习和适应。
将这些全部结合在一起,你会得到一个不仅生成答案而且采取行动并完成任务的AI代理。这就是它们相比于普通大型语言模型如此强大的原因。
构建LinkedIn个人资料获取AI代理
现在,让我们深入实际构建过程!我们将使用LangChain库来创建我们的AI代理。对于这个小项目,我们的代理将使用两个主要工具根据用户输入搜索LinkedIn个人资料:来自Phidata的GoogleSearch工具和Tavily搜索API。GoogleSearch工具将帮助我们的代理在Google上快速搜索,特别是查找LinkedIn个人资料。另一方面,Tavily搜索API将使我们的代理能够在LinkedIn内进行更具体的搜索,直接从API获取结果。
我们将把这些工具组合成一个LangChain代理,当用户提供姓名时,它将能够搜索网络并获取最相关的LinkedIn个人资料链接。让我们开始编码,让这个代理变为现实吧!
Step 1: Getting the Python Environment Ready
让我们开始创建一个新的Python环境并安装以下提到的库:
- langchain
- langchain_ollama
- langchain_groq
- langchain_core
- langchain_tools
- langchain_community
- dotenv
- phidata
- googlesearch-python
步骤 — 2: 准备 API 密钥
对于这个迷你项目,我们需要两个 API 密钥:
-
Tavily API Key: Tavily 直接从我们的 Python 代码提供搜索功能,使我们的大型语言模型能够提取 LinkedIn 个人资料信息。要获取 API 密钥,只需前往 Tavily 并使用您的电子邮件注册。您将获得 1000 个免费积分以开始使用!
-
Groq API Key: Groq 提供对多种大型语言模型的免费 API 调用,这对我们的 AI 代理至关重要。您有两个选择:可以使用像 Groq 这样的免费 API 提供商,或者选择 OpenAI 或 Mistral 等流行选项。另一个选择是使用 Ollama 等工具在本地托管您自己的大型语言模型——我们将在未来的博客中讨论这个。对于这个项目,我们将使用 Groq,因为它是免费的,并且可以让我们访问多个大型语言模型。要获取您的 API 密钥,请前往 Groq 的控制台 并生成一个。
不要忘记将 API 密钥放在 .env 文件中。我们将使用 Python 的 dotenv 库将 API 密钥提取到环境变量中。以下是参考。注意——请使用相同的变量名称:
TAVILY_API_KEY=***********************
GROQ_API_KEY=*************************
步骤 — 3: 设置Agent所需的工具函数
让我们通过使用来自langchain_community库的Tavily搜索来创建搜索工具
from dotenv import load_dotenv
from langchain_community.tools.tavily_search import TavilySearchResults
load_dotenv()
def search_profile_url_using_tavily(name):
search = TavilySearchResults()
return search.run(name)
上述函数search_profile_url_using_tavily使用TAVILY_API_KEY并对给定的名称进行搜索并返回结果。
我们将要使用的第二个工具是来自phidata库的谷歌搜索工具 — https://docs.phidata.com/tools/googlesearch。注意 — 这个工具是可选的,我只是想展示大型语言模型在选择工具时是如何决策的,因此在这个例子中我们使用了两个搜索工具
from phi.tools.googlesearch import GoogleSearch
我们可以直接使用上述导入的GoogleSearch工具。由于这个工具是从phidata内置的,因此不需要像我们对search_profile_url_using_tavily所做的那样将其封装在一个函数中。
第四步 — 创建代理
是的,你没看错,我们快完成代理的构建了。剩下的唯一步骤是从langchain的Agent类创建一个Agent。
from langchain.prompts import PromptTemplate
from langchain_groq import ChatGroq
from langchain.tools import Tool
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
from langchain_community.tools.tavily_search import TavilySearchResults
from dotenv import load_dotenv
load_dotenv()
from phi.tools.googlesearch import GoogleSearch
def search_profile_url_using_tavily(name):
search = TavilySearchResults()
return search.run(name)
def get_linkedin_url(name: str) -> str:
groq_llm = ChatGroq(model="llama-3.3-70b-versatile", temperature=0)
template = """Given the full name {name_of_person} I want you to get me a link to their linkin profile page. Your answer should only contain the URL"""
prompt_template = PromptTemplate(input_variables=["name_of_person"], template=template)
tools_for_agent = [
Tool(
name="Crawl google for linkedin profile page",
func=search_profile_url_using_tavily,
description="Tool to get linkedin profile page from google"
),
Tool(
name="Google search tool",
func=GoogleSearch().google_search,
description="Tool to perform a google search"
)
]
react_prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm=groq_llm, tools=tools_for_agent, prompt=react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools_for_agent, verbose=True,
handle_parsing_errors=True)
result = agent_executor.invoke(input={"input": prompt_template.format_prompt(name_of_person=name)})
return result["output"]
让我们来分解一下。
def get_linkedin_url(name: str) -> str:
groq_llm = ChatGroq(model="llama-3.3-70b-versatile", temperature=0)
template = """Given the full name {name_of_person} I want you to get me a link to their linkin profile page. Your answer should only contain the URL"""
prompt_template = PromptTemplate(input_variables=["name_of_person"], template=template)
tools_for_agent = [
Tool(
name="Crawl google for linkedin profile page",
func=search_profile_url_using_tavily,
description="Tool to get linkedin profile page from google"
),
Tool(
name="Google search tool",
func=GoogleSearch().google_search,
description="Tool to perform a google search"
)
]
react_prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm=groq_llm, tools=tools_for_agent, prompt=react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools_for_agent, verbose=True,
handle_parsing_errors=True)
result = agent_executor.invoke(input={"input": prompt_template.format_prompt(name_of_person=name)})
return result["output"]
在这个函数中,我们正在创建一个AI代理,可以根据一个人的名字找到LinkedIn个人资料。它的工作原理如下:
选择LLM:首先,我们设置了一个名为llama-3.3–70b-versatile的Groq LLM(大型语言模型)来处理AI任务。我们还将temperature设置为0,这意味着我们希望输出更集中而不随机。
groq_llm = ChatGroq(model="llama-3.3-70b-versatile", temperature=0)
创建提示:我们定义了一个模板,告诉模型在给定一个人的全名时,它应该返回他们的LinkedIn个人资料的URL。这个提示很简单,要求LLM获取个人资料链接,仅此而已。
template = """Given the full name {name_of_person} I want you to get me a link to their linkin profile page. Your answer should only contain the URL"""
prompt_template = PromptTemplate(input_variables=["name_of_person"], template=template)
工具设置:我们使用两个工具来帮助代理找到LinkedIn个人资料:
- Tavily工具:这个工具将使用Tavily在Google上搜索LinkedIn个人资料。
- GoogleSearch工具:这个来自phidata的内置工具也将执行Google搜索以找到LinkedIn个人资料。
tools_for_agent = [
Tool(
name="Crawl google for linkedin profile page",
func=search_profile_url_using_tavily,
description="Tool to get linkedin profile page from google"
),
Tool(
name="Google search tool",
func=GoogleSearch().google_search,
description="Tool to perform a google search"
)
]
创建代理:使用LangChain,我们创建一个React代理。这个代理可以使用我们设置的LLM和工具处理信息。代理将遵循提示中的指示,并使用工具收集正确的信息。
注意,我们从langchain hub拉取了一个ReAct基础提示,hwchase17/react是一个流行的提示。
ReAct基础提示在构建AI代理时至关重要,因为它结合了推理和行动。它帮助代理不仅执行任务,还能逻辑思考。这确保代理做出更好的决策,适应不同情况,并更有效地使用可用工具。通过用明确的指示引导代理,ReAct框架使其更聪明、更高效,使其能够处理复杂场景并提供更准确的结果。
react_prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm=groq_llm, tools=tools_for_agent, prompt=react_prompt)
以下是我们从langchain hub拉取的上述react提示的底层模板:
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought: {agent_scratchpad}
执行代理:我们使用AgentExecutor来运行代理,将输入(个人的名字)传入系统。执行器确保代理正确使用工具并返回LinkedIn个人资料的URL。
agent_executor = AgentExecutor(agent=agent, tools=tools_for_agent, verbose=True,
handle_parsing_errors=True)
返回结果:最后,代理返回的结果是LinkedIn个人资料的URL。
result = agent_executor.invoke(input={"input": prompt_template.format_prompt(name_of_person=name)})
return result["output"]
就是这样!我们完成了。现在让我们通过传递一个名字来执行get_linkedin_url函数。
注意 — 在这种情况下,我传递了我自己的名字以及我的公司名字,以便让代理的工作稍微简单一些!
从上面的截图中,你可以看到代理如何开始其思考过程并独立决定使用 Google搜索工具。它成功地检索到相关的搜索结果,但没有一个LinkedIn个人资料完全匹配“Maseed Mohammad Ilyas Kipi。”这表明该个人资料可能不容易通过简单的Google搜索发现,或者可能不是公开可访问的。尽管如此,代理认识到任务是找到特定个人的LinkedIn个人资料。因此,它决定使用“Crawl Google for LinkedIn profile page”工具,结合全名来看看是否可以直接找到该个人资料。
然后它使用Tavily搜索工具再次优化搜索结果,最终得出了答案并结束了链条。
在这个小项目中,我们成功构建了一个小型AI代理,可以根据一个人的名字搜索LinkedIn个人资料。通过结合像Tavily和GoogleSearch这样的工具,代理使用推理做出决策并获取最相关的搜索结果。这展示了AI代理高效执行特定任务的能力,同时也能适应情况并使用最佳可用工具。通过这种设置,我们为能够与各种数据源交互并提供更复杂的代理奠定了基础。
最后,AI代理代表了自动决策的未来,超越了大型语言模型的局限性,通过主动与工具互动、推理任务和适应不同情况。在这篇博客中,我们介绍了创建一个简单的AI代理以获取LinkedIn个人资料URL的过程。通过利用Tavily和GoogleSearch等工具,我们展示了代理如何自主做出决策并执行LLMs可能难以完成的任务。这仅仅是个开始——AI代理在以更大的自主性和精确度解决复杂的现实问题方面具有巨大的潜力。