avatarZoumana Keita

总结

网页主要介绍了如何利用人工智能代理(AI Agents)从概念到Python中的实际应用,以及如何构建一个内容创作工作流程,通过多个代理协作完成从视频分析到博客撰写的复杂任务。

摘要

本文首先阐述了非洲谚语中的团队合作理念,即“单打独斗,我们走得更快。携手,我们走得更远”,指出在处理多步骤任务时,相比于单一的大型语言模型(LLM),多个AI代理的协作可以更好地分解任务复杂性,提高系统的鲁棒性和结果的质量。接着,文章详细介绍了一个由四个AI代理组成的系统的工作流程,这些代理分别负责视频内容搜索、博客文章撰写、LinkedIn帖子创作和Twitter推文生成。

文章进一步探讨了为什么要关注AI代理而不是单一的LLM,包括任务执行的灵活性、任务连续性和情境保持、专业化与互动以及互联网接入等方面的优势。然后,文章指导如何设置先决条件,创建每个代理及其角色和任务,并通过Python代码示例了解了如何实现这些代理的创建和任务的执行。最后,文章提出了对AI代理进行客观和可扩展的评估方法,并总结了如何有效地评估这些人工智能代理的性能。

观点

  1. 多代理协作的优势:相比于单一的LLM,多个AI代理可以更有效地处理复杂的多步骤任务,提供更灵活、连续性更强、专业化更高且更新的信息。

  2. AI代理的创建和角色定义:通过定义代理的角色、目标、背景故事和记忆等属性,可以创建出具有特定功能的AI代理。

  3. 任务的执行和输出:每个AI代理执行特定的任务,并将结果输出到不同的标记文件中,如博客文章、LinkedIn帖子和Twitter推文。

  4. AI代理的评估方法:为了确保AI代理的性能和准确性,需要采用基准测试、事实准确性测量和情境感知相关性评分等方法进行评估。

  5. 实践案例和代码示例:文章提供了具体的Python实现代码,展示了如何利用AI代理创建内容并实现自动化的内容创作工作流程。

  6. 对AI代理未来发展的展望:AI代理的应用有望改变人工智能及其能力的认知,并在未来的内容创作和自动化任务中扮演重要角色。

AI Agents — From Concepts to Practical Implementation in Python
人工智能代理--从概念到 Python 中的实际应用

This will change the way you think about AI and its capabilities
这将改变你对人工智能及其能力的看法

Motivation
动机

As an African proverb states:
正如一句非洲谚语所说

Alone, we go faster. Together, we go further.
单打独斗,我们走得更快。携手,我们走得更远。

This also relates to the idea that no one can be an expert in every field. Team work and effective delegation of tasks becomes crucial to achieve great things.
这也与 "没有人可以成为每个领域的专家 "这一理念有关。团队合作和有效的任务分配对于成就大事至关重要。

Similar principles applies to Large Language Models (LLMs). Instead of prompting a single LLM to handle a complex task, we can combine multiple LLMs or AI Agents , each one specializing in a specific area.
类似的原则也适用于大型语言模型(LLM)。我们可以将多个 LLM 或人工智能代理结合起来,每个代理专门负责一个特定领域,而不是让一个 LLM 来处理复杂的任务。

This strategy can lead to a more robust system with higher-quality results.
这种策略可以使系统更强大,结果质量更高。

In this article you will learn:
在本文中,您将了解到

  • What AI Agents are
    什么是人工智能代理
  • Why it is worth considering them to solving real-world use cases
    为什么值得考虑用它们来解决现实世界中的使用案例
  • How to create a complete AI Agents system from scratch
    如何从零开始创建完整的人工智能代理系统

General Workflow of the system
系统的一般工作流程

Before diving into any coding, let’s have a clear understanding of the main components of the system being built in this article.
在开始编码之前,让我们先清楚地了解一下本文所构建系统的主要组成部分。

Autonomous AI Agents workflow (Image by Author)
自主人工智能代理工作流程(图片由作者提供)
  • The workflow has overall four agents, and each one has a specialized skillset.
    工作流程共有四个代理,每个代理都有专门的技能。
  • First, the user’s request is submitted to the system.
    首先,向系统提交用户请求。
  • Agent 1 or Video Analyzerperforms a deep research on the internet to find relevant information about the user’s request using external tools like YouTube Channel Search . The result from that agent is sent to the next agents for further processing.
    代理 1 或视频分析器使用 YouTube 频道搜索等外部工具在互联网上进行深入研究,查找与用户请求相关的信息。该代理的结果将被发送到下一个代理进行进一步处理。
  • Agent 2 or blog post writer leverages the previous result to write a comprehensive blog post.
    代理 2 或博文撰写人利用之前的结果撰写一篇全面的博文。
  • Similarly to Agent 2 , Agent 3 and Agent 4 also create engaging LinkedIn post and Tweets respectively.
    与代理 2 类似,代理 3 和代理 4 也分别在 LinkedIn 上发布了吸引人的帖子和推文。
  • The response from both Agent 2 , Agent 3 , and Agent 4 are saved into different markdown files, which can be used by end users.
    来自代理 2、代理 3 和代理 4 的响应都被保存到不同的标记文件中,可供最终用户使用。

Why should we care about AI Agents instead of a single prompted LLM?
我们为什么要关注人工智能代理,而不是单一的提示性法律硕士?

If you remember the article I wrote about using LLMs for document parsing, you will notice that this requested tasks is a monolithic, meaning that the LLM tasked with a single goal: Data Extraction.
如果你还记得我写的那篇关于使用 LLM 进行文档解析的文章,你就会注意到这个请求任务是一个单一的任务,这意味着 LLM 的任务只有一个目标:数据提取。

Such approach’s limitations because obvious when dealing with more complex, multi-steps tasks. Some of these limitations are illustrated below:
在处理更复杂的多步骤任务时,这种方法的局限性就显而易见了。下面将对其中一些局限性进行说明:

1.Flexibility of task execution
1.任务执行的灵活性

  • Single prompted LLMs require carefully writing prompts for each task, and may be difficult to update when expectations change from the initial tasks requirements.
    单一提示式 LLM 需要为每项任务仔细编写提示,而且当预期与最初的任务要求发生变化时,可能很难更新。
  • AI Agents break down those complexities into subtasks, adapt their behavior, without requiring an extensive effort in prompt engineering.
    人工智能代理可将这些复杂性分解为子任务,调整自己的行为,而不需要进行大量的提示工程。

2. Task continuity and context retention
2.任务连续性和情境保持

  • Single prompted LLMs may potentially lose important context from previous interactions. This is because they mainly operates within the constraints of a single conversation turn.
    单次提示的 LLM 可能会丢失以前互动的重要语境。这是因为它们主要是在单一对话回合的限制下运行。
  • AI Agents provides the capability of maintaining context across different interactions, and each agent can refer back to the previous agents response to complete what they are expected to perform.
    人工智能代理能够在不同的交互过程中保持上下文,每个代理都可以参考前一个代理的回应来完成他们应该完成的任务。

3. Specialization and Interactions
3.专业化与互动

  • Single prompted LLMs may have a specialized domain expertise after an extensive fine-tuning, which may be time and financially expensive.
    经过大量的微调后,单一的法学硕士可能会拥有专门的领域知识,这可能会耗费大量的时间和财力。
  • AI Agents on the other hand can be designed as a crew of specialized models, where each model focuses on a specific task such as researcher , blog writer , social media expert .
    另一方面,人工智能代理可以设计为一组专业模型,每个模型专注于特定任务,如研究员、博客写手、社交媒体专家等。

4. Internet Access
4.互联网接入

  • Single prompted LLMs rely on predefined knowledge base, which may not be up to date, leading to hallucinations or limited access.
    单一提示式 LLM 依赖于预定义的知识库,而知识库可能不是最新的,从而导致幻觉或访问受限。
  • AI Agents can have the ability to access the internet, providing them with the capability to provide more up-to-date information leading to a better decision-making.
    人工智能代理可以访问互联网,提供更多最新信息,从而做出更好的决策。

Building a Content Creation Workflow
建立内容创作工作流程

In this section, we explore how to leverage an agentic workflow to create a system that writes blog posts, LinkedIn content, Twitter posts, after an extensive research about the user’s topic.
在本节中,我们将探讨如何利用代理工作流创建一个系统,在对用户的主题进行广泛研究后,撰写博客文章、LinkedIn 内容和 Twitter 帖子。

If you are more of a video oriented person, I will be waiting for you on the other side.
如果你更喜欢视频,我会在另一边等你。

Structure of the code
代码结构

The code is structured as follows:
代码结构如下

project
   |
   |---Multi_Agents_For_Content_Creation.ipynb
   |
  data
   |
   |---- blog-post.md
   |---- linkedin-post.md
   |---- tweet.md
  • project folder is the root folder and contains the data folder, and the notebook
    项目文件夹是根文件夹,包含数据文件夹和笔记本文件夹。
  • data folder is currently empty but should contain the following three markdown files after the execution of the overall workflow: blog-post.md , linkedin-post.md , and tweet.md
    数据文件夹目前是空的,但在执行整个工作流程后应包含以下三个标记符文件:blog-post.md、linkedin-post.md 和 tweet.md
  • Each markdown file contains the result of the task performed by the the corresponding agent
    每个标记文件都包含相应代理执行任务的结果

Agents Creation With Their Roles and Tasks
代理创建及其角色和任务

Now that we have explored what each agent’s role is in the previous sections, let’s see how to actually create them, along with their roles and tasks.
既然我们已经在前面的章节中探讨了每个代理的角色,那么让我们来看看如何实际创建他们以及他们的角色和任务。

Before that, let set up the prerequisites for us to better implement those roles and tasks.
在此之前,让我们为更好地执行这些角色和任务设定先决条件。

Prerequisites
先决条件

The code is run from a Google Colab notebook, and there are only two libraries required for our use case: openai and crewai[tools] and they can be installed as follows.
代码通过 Google Colab 笔记本运行,我们的使用案例只需要两个库:openai 和 crewai[工具],安装方法如下。

%%bash
pip -qqq install 'crewai[tools]'
pip -qqq install youtube-transcript-api
pip -qqq install yt_dlp

After successfully installing the libraries, the next step is to import the following necessary modules:
成功安装库后,下一步是导入以下必要模块:

import os
from crewai import Agent
from google.colab import userdata
from crewai import Crew, Process
from crewai_tools import YoutubeChannelSearchTool
from crewai import Task

Each agent leverages the OpenAI gpt-4o model, and we need to set up the access to the model via our OPENAI API KEY as follows:
每个代理都利用 OpenAI gpt-4o 模型,我们需要通过我们的 OPENAI API KEY 设置对模型的访问,如下所示:

OPENAI_API_KEY = userdata.get('OPEN_AI_KEY')
model_ID = userdata.get('GPT_MODEL')
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["OPENAI_MODEL_NAME"] = model_ID
Environment variables and their values (Image by Author)
环境变量及其值(图片由作者提供)
  • First we access both the OPEN_AI_KEY and GPT_MODEL from Google colab secrets using the built-in userdata.get function.
    首先,我们使用内置的 userdata.get 函数从 Google colab secrets 中访问 OPEN_AI_KEY 和 GPT_MODEL。
  • Then we set up both the OPEN AI KEY and gpt-4o model using the os.environ function.
    然后,我们使用 os.environ 函数设置了 OPEN AI KEY 和 gpt-4o 模型。
  • After the above two steps, there should not be any issue using the model to create the agents.
    完成以上两个步骤后,使用模型创建代理应该不会有任何问题。

Agents and their Roles
代理及其作用

With the Agent class, we can create an agent by mainly providing the following attributes: role , goal , backstory , and memory .
通过代理类,我们可以创建一个代理,主要提供以下属性:角色、目标、背景故事和记忆。

Only Agent 1 or Video Analyzerhas these additional attributes: tools and allow_delegation .
只有代理 1 或视频分析器具有这些附加属性:工具和 allow_delegation。

Most of those attributes are self-explanatory, but let’s understand what they mean.
这些属性大多不言自明,但让我们来了解一下它们的含义。

  • role is like a Job Title, and defines the exact role of an agent. For instance Agent 1 role is Topic Researcher
    角色就像职位名称,定义了代理的确切角色。例如,代理 1 的角色是主题研究员
  • goal tells the agent what it’s role is with regards to its role
    目标告诉代理它在角色中扮演什么角色
  • backstory elaborates more on what an agent’s role, by making it specific
    背景故事更详细地阐述了代理人的角色,使其具体化
  • memory attribute is a boolean. When set to True it allows the agent to remember, reason, and also learn from past interactions.
    记忆属性是一个布尔值。当设置为 "真 "时,它允许代理记忆、推理并从过去的互动中学习。
  • tools is a list of tools used by an agent to perform its task
    工具是代理执行任务时使用的工具列表
  • allow_delegation is a boolean telling whether the result of an agent must be delegated to other agents for further processing.
    allow_delegation 是一个布尔值,表示是否必须将代理的结果委托给其他代理进一步处理。

Now, let’s create each one of our agents.
现在,让我们创建每一个代理。

BUT
但是

Before that, we let set up the tool that needs to be used by the first agent to explore my personal YouTube channel.
在此之前,我们先设置好第一位代理需要使用的工具,以便探索我的个人 YouTube 频道。

This is achieved using the YouTubeChannelSearchTool class, by providing the handle @techwithzoum .
这是通过提供 @techwithzoum 句柄,使用 YouTubeChannelSearchTool 类实现的。

# The tool used by the topic researcher
youtube_tool = YoutubeChannelSearchTool(youtube_channel_handle='@techwithzoum')
  1. Agent 1 — Topic Researcher
    代理 1 - 主题研究员
topic_researcher = Agent(
    role='Topic Researcher',
    goal='Search for relevant videos on the topic {topic} from the provided YouTube channel',
    verbose=True,
    memory=True,
    backstory='Expert in finding and analyzing relevant content from YouTube channels, specializing in AI, Data Science, Machine Learning, and Generative AI topics.',
    tools=[youtube_tool],
    allow_delegation=True
)
  • We start by defining the role of the Agent as a Topic Researcher
    我们首先将代理的角色定义为主题研究员
  • Then we ask the agent to use the {topic} provided to find relevant videos mentioning that topic.
    然后,我们要求代理使用提供的 {topic} 查找提及该主题的相关视频。
  • Finally, our first agent is defined as an expert in finding and analyzing relevant content about AI, Data Science, Machine Learning, and Generative AI topics using the YouTube search tool.
    最后,我们的第一个代理被定义为使用 YouTube 搜索工具查找和分析人工智能、数据科学、机器学习和生成式人工智能主题相关内容的专家。

The great thing in the current definition of an agent is exactly the same with minor changes in the attributes’ value. Once understood, then no explanation is required for the next agents’ definition.
当前代理定义中的重要内容完全相同,只是属性值略有变化。一旦理解了这一点,下一个代理的定义就不需要解释了。

2. Agent 2 — Blog Writer
2.代理 2 - 博客撰稿人

blog_writer = Agent(
    role='Blog Writer',
    goal='Write a comprehensive blog post from the transcription provided by the Topic Researcher, covering all necessary sections',
    verbose=True,
    memory=True,
    backstory='Experienced in creating in-depth, well-structured blog posts that explain technical concepts clearly and engage readers from introduction to conclusion.',
    allow_delegation=False
)

3. Agent 3 — LinkedIn Post Creator
3.代理 3 - LinkedIn Post Creator

# LinkedIn Post Agent
linkedin_post_agent = Agent(
    role='LinkedIn Post Creator',
    goal='Create a concise LinkedIn post summary from the transcription provided by the Topic Researcher.',
    verbose=True,
    memory=True,
    backstory='Expert in crafting engaging LinkedIn posts that summarize complex topics and include trending hashtags for maximum visibility.',
    allow_delegation=False
)

4. Agent 4 — Twitter Post Creator
4.代理 4 - Twitter 帖子创建器

twitter_agent = Agent(
    role='Twitter Content Creator',
    goal='Create a short tweet from the transcription provided by the Topic Researcher that capture key points and insights',
    verbose=True,
    memory=True,
    backstory='Specializes in distilling complex information into concise, impactful tweets that resonate with a tech-savvy audience.',
    allow_delegation=False
)

We notice that none the last three agents delegate their tasks. This is because their result is not processed by other agents.
我们注意到,后三个代理都没有委托任务。这是因为其他代理没有处理它们的结果。

Perfect! Now our agents are ready to learn about what is expected from them, and that’s performed via the Task class.
完美!现在,我们的代理已经准备好了解我们对他们的期望,这可以通过任务类来实现。

Tasks
任务

A human being performs task to deliver something after receiving the instructions to execute those tasks.
人类在收到执行任务的指令后,就会执行任务,交付东西。

The same applies to agents, and the attributes required for successfully performing those tasks and delivering result are the followings:
代理商也是如此,成功执行这些任务并取得成果所需的属性如下:

  • description corresponds to the clear description of what needs to be performed by the agent. The clear the description, the better is the output of the model
    描述是对代理需要执行的任务的清晰描述。描述越清晰,模型的输出就越好
  • expected_output is the textual description of the result expected from the agent
    expected_output 是对代理预期结果的文字描述
  • agent is the placeholder for the agent responsible for executing that specific task
    代理是负责执行该特定任务的代理的占位符
  • tools is similar to the definition in the role section, and not every agent uses a tool. In our case, only the Topic Researcher uses a tool
    工具的定义与角色部分的定义类似,并非每个代理都使用工具。在我们的案例中,只有主题研究员使用工具
  • output_file is the filename and its format. This is only specified for agents that need to have their tasks result in a file, like a markdown, in which case the filename could be blog-post.md for the Blog Writer
    output_file 是文件名及其格式。只有需要将任务结果以文件形式(如 markdown)输出的代理才需要指定输出文件,在这种情况下,文件名可以是 Blog Writer 的 blog-post.md。

Let’s dive into the Python implementation of those tasks for each agent.
让我们深入了解每个代理的这些任务的 Python 实现。

  1. Agent 1 — Topic Researcher
    代理 1 - 主题研究员
research_task = Task(
    description="Identify and analyze videos on the topic {topic} from the specified YouTube channel.",
    expected_output="A complete word by word report on the most relevant video found on the topic {topic}.",
    agent=topic_researcher,
    tools=[youtube_tool]
)

2. Agent 2 — Blog Writer
2.代理 2 - 博客撰稿人

blog_writing_task = Task(
    description=""" Write a comprehensive blog post based on the transcription provided by the Topic Researcher.
                    The article must include an introduction , step-by-step guides, and conclusion.
                    The overall content must be about 1200 words long.""",
    expected_output="A markdown-formatted of the blog",
    agent=blog_writer,
    output_file='./data/blog-post.md'
)

3. Agent 3 — LinkedIn Post Creator
3.代理 3 - LinkedIn Post Creator

linkedin_post_task = Task(
    description="Create a LinkedIn post summarizing the key points from the transcription provided by the Topic Researcher, including relevant hashtags.",
    expected_output="A markdown-formatted of the LinkedIn post",
    agent=linkedin_post_agent,
    output_file='./data/linkedin-post.md'
)

4. Agent 4 — Twitter Post Creator
4.代理 4 - Twitter 帖子创建器

twitter_task = Task(
    description="Create a tweet from the transcription provided by the Topic Researcher, including relevant hastags.",
    expected_output="A markdown-formatted of the Twitter post",
    agent=twitter_agent,
    output_file='./data/tweets.md'
)

For each agent, the attributes are self-explanatory, and the result of the
对于每个代理,属性是不言自明的。

  • first agent is a raw text data used by the last three agents
    第一个代理是后三个代理使用的原始文本数据
  • second agent is markdown file called blog-post.md
    第二个代理是名为 blog-post.md 的标记文件
  • third agent is also a markdown file called linked-post.md
    第三个代理也是一个名为 linked-post.md 的标记符文件
  • last agent is the same with the name tweets.md
    最后一个代理的名称与 tweets.md 相同

Time for Agents to Get to Work
代理公司开始工作的时间到了

This last step orchestrates our agents as a team to properly execute their tasks as follows:
最后一个步骤将我们的代理作为一个团队进行协调,以正确执行其任务,具体如下:

my_crew = Crew(
    agents=[topic_researcher, linkedin_post_agent, twitter_agent, blog_writer],
    tasks=[research_task, linkedin_post_task, twitter_task, blog_writing_task],
    verbose=True,
    process=Process.sequential,
    memory=True,
    cache=True,
    max_rpm=100,
    share_crew=True
)
  • agents corresponds to the list of all our agents
    代理对应于我们所有代理的列表
  • tasks is the list of the tasks to be performed by each agent
    任务是每个代理要执行的任务列表
  • We set verbose to True to have the full execution trace
    我们将 "verbose "设置为 "True",以获得完整的执行轨迹
  • max_rpm is the maximum number of requests per minute our crew can perform to avoid rate limits
    max_rpm 是为避免速率限制,机组人员每分钟可执行的最大请求数
  • Finally, share_crew means that agents are sharing resources to execute their tasks. This corresponds to the first agent sharing its response with other agents.
    最后,share_crew 表示代理共享资源来执行任务。这相当于第一个代理与其他代理共享其响应。

After orchestrating the agents, it is time trigger them using the kickoff function which takes as parameter a dictionary of inputs. Here we are searching about a video I recorded about GPT3.5 Turbo Fine-tuning with Graphical Interface
在对代理进行协调后,就可以使用 kickoff 函数触发代理了,该函数的参数是输入字典。在此,我们将搜索我录制的关于 GPT3.5 图形界面涡轮微调的视频

topic_of_interest = 'GPT3.5 Turbo Fine-tuning and Graphical Interface'
result = my_crew.kickoff(inputs={'topic': topic_of_interest})

The successful execution of the above code generates all the three markdown files that we have specified above.
成功执行上述代码后,就会生成上述指定的三个标记符文件。

Here is the result showing the content of each file. As someone who recorded the video, that perfectly corresponds to what was covered in the tutorial.
以下是显示每个文件内容的结果。作为录制视频的人,这与教程中的内容完全一致。

The blog agent did not provide a hundred percent step-by-step guide for users to execute the code without facing an issue, but it provides a great understanding of the scope of the tutorial.
博客代理并没有为用户提供百分之百的分步指导,让用户在不遇到问题的情况下执行代码,但它提供了对教程范围的一个很好的理解。

For the LinkedIn and Twitter posts, the results are brilliant!
在 LinkedIn 和 Twitter 上发布的帖子,效果非常好!

You can check the content of all the files within theai_agents_outputs folder.
您可以检查ai_agents_outputs 文件夹中所有文件的内容。

Confidence does not include control — Evaluate those agents!
信心不包括控制 - 评估这些代理!

My above assessment of the agents is based on my personal familiarity with the content. However, the need for a more objective and scalable evaluation methods becomes crucial before deploying into production.
我对代理的上述评估是基于我个人对内容的熟悉程度。不过,在部署到生产中之前,需要一种更加客观和可扩展的评估方法,这一点至关重要。

Below are some strategies for efficiently evaluating those AI agents.
下面是一些有效评估这些人工智能代理的策略。

  • Benchmark testing can be used to evaluate each agent performance across divers tasks using established datasets like GLUE , and FLASK allowing a standardized comparisons with different state-of-the-art models.
    基准测试可使用 GLUE 和 FLASK 等成熟数据集,评估每个代理在不同任务中的性能,以便与不同的先进模型进行标准化比较。
  • Factual Accuracy Measurement evaluates an agent’s capability to provide factual responses to a diverse range of questions across multiple domains.
    事实准确性测量可评估代理对多个领域的各种问题做出事实性回答的能力。
  • Context-Awareness Relevance Scoring can be used to quantity how well the agent response align with a given prompt.
    情境感知相关性评分可用于衡量代理响应与给定提示的吻合程度。

Multiple frameworks can be leveraged to perform these evaluations, and some of them include:
可以利用多种框架来执行这些评估,其中一些框架包括

  • DeepEval which is an open-source tool for quantifying LLMs’ performance across divers metrics.
    DeepEval 是一个开源工具,用于量化 LLM 在各种指标方面的性能。
  • MMLU (Massive Multitask Language Understanding) is a framework that tests models on divers range of subjects both zero-shot and one-shot settings.
    MMLU(大规模多任务语言理解)是一个框架,可在零点击和单点击设置下对各种主题的模型进行测试。
  • OpenAI evals is also a framework to evaluate LLMs or any system built using LLMs.
    OpenAI evals 也是一个评估 LLM 或任何使用 LLM 构建的系统的框架。

Conclusion
结论

This article provided a brief overview how to leverage AI agents to effectively accomplish advanced tasks instead of prompting a single Large Language Model to perform the same task.
本文简要介绍了如何利用人工智能代理来有效完成高级任务,而不是促使单个大型语言模型来执行相同的任务。

I hope this short tutorial helped you acquire new skill sets, and the complete code is available on my GitHub, and please subscribe to my YouTube to support my content.
我希望这个简短的教程能帮助你掌握新的技能,完整的代码可以在我的 GitHub 上找到,也请订阅我的 YouTube 以支持我的内容。

Also, If you like reading my stories and wish to support my writing, consider becoming a Medium member. With a $5-a-month commitment, you unlock unlimited access to stories on Medium.
此外,如果您喜欢读我的故事并希望支持我的写作,请考虑成为 Medium 会员。只需每月支付 5 美元,您就可以无限制地访问 Medium 上的故事。

Would you like to buy me a coffee ☕️? → Here you go!
你想给我买杯咖啡吗 ☕️?→ 给你!

Feel free to follow me on Twitter, or say Hi on LinkedIn. It is always a pleasure to discuss AI stuff!
欢迎在 Twitter 上关注我,或在 LinkedIn 上与我打招呼。讨论人工智能问题总是令人愉快的!

Artificial Intelligence
Programming
Python
Large Language Models
OpenAI
Recommended from ReadMedium