{
  "source_file": "0930",
  "source_platform": "Medium",
  "author": "Hesam Sheikh",
  "title_listed": "A Comprehensive Guide to Collaborative AI Agents in Practice",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/",
  "publish_date": "2024-07-03",
  "corpus_stage": "",
  "notes": "",
  "id": "6006772dccc6",
  "collected_at": "2026-10-02T06:29:39",
  "title": "A Comprehensive Guide to Collaborative AI Agents in Practice | Towards Data Science",
  "body_markdown": "![Revisit consent button](../images/body-df29beacd7496220cc94.svg)\nWe value your privacy\nWe use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \"Accept All\", you consent to our use of cookies.\nCustomise Reject All Accept All\nCustomise Consent Preferences ![](../images/body-2159bb67f3de8ad870eb.svg)\nWe use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\nThe cookies that are categorised as \"Necessary\" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more\nNecessaryAlways Active\nNecessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\n  * Cookie\nBCTempID\n  * Duration\n10 minutes\n  * Description\nNo description available.\n\n\n  * Cookie\n__cf_bm\n  * Duration\n1 hour\n  * Description\nThis cookie, set by Cloudflare, is used to support Cloudflare Bot Management. \n\n\n  * Cookie\nAWSALBCORS\n  * Duration\n7 days\n  * Description\nAmazon Web Services set this cookie for load balancing.\n\n\n  * Cookie\n_cfuvid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services\n\n\n  * Cookie\nli_gc\n  * Duration\n6 months\n  * Description\nLinkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.\n\n\n  * Cookie\n__hssrc\n  * Duration\nsession\n  * Description\nThis cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.\n\n\n  * Cookie\n__hssc\n  * Duration\n1 hour\n  * Description\nHubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.\n\n\n  * Cookie\nwpEmojiSettingsSupports\n  * Duration\nsession\n  * Description\nWordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.\n\n\n  * Cookie\nBCSessionID\n  * Duration\n1 year 1 month 4 days\n  * Description\nBlueconic sets this cookie as a unique identifier for the BlueConic profile.\n\n\n  * Cookie\n_octo\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nlogged_in\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\n__Secure-YEC\n  * Duration\npast\n  * Description\nYouTube sets this cookie to stores the user's video player preferences using embedded YouTube video\n\n\n  * Cookie\n__eoi\n  * Duration\n6 months\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTGCORS\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\nlogin-status-p\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTG\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\ncsrf_token\n  * Duration\nsession\n  * Description\nNo description available.\n\n\n  * Cookie\ntoken_v2\n  * Duration\n1 day\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nD\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nPHPSESSID\n  * Duration\nsession\n  * Description\nThis cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.\n\n\n  * Cookie\nVISITOR_PRIVACY_METADATA\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to store the user's cookie consent state for the current domain. \n\n\n  * Cookie\ncookietest\n  * Duration\nsession\n  * Description\nThe cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.\n\n\n  * Cookie\n__Host-airtable-session\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\n__Host-airtable-session.sig\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\nm\n  * Duration\n1 year 1 month 4 days\n  * Description\nStripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.\n\n\n  * Cookie\nBIGipServer*\n  * Duration\nsession\n  * Description\nMarketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. \n\n\n  * Cookie\n__cfruid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to identify trusted web traffic.\n\n\n  * Cookie\n_GRECAPTCHA\n  * Duration\n6 months\n  * Description\nGoogle Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.\n\n\n  * Cookie\n__Secure-YNID\n  * Duration\n6 months\n  * Description\nGoogle cookie used to protect user security and prevent fraud, especially during the login process.\n\n\n  * Cookie\ncookieyes-consent\n  * Duration\n1 year\n  * Description\nCookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.\n\n\nFunctional\nFunctional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\n  * Cookie\nlidc\n  * Duration\n1 day\n  * Description\nLinkedIn sets the lidc cookie to facilitate data center selection.\n\n\n  * Cookie\nbrw\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nbrwConsent\n  * Duration\n5 minutes\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nWMF-Uniq\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nloom_anon_comment\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nloom_referral_video\n  * Duration\nsession\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nVISITOR_INFO1_LIVE\n  * Duration\n6 months\n  * Description\nA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.\n\n\n  * Cookie\nyt-remote-connected-devices\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nytidb::LAST_RESULT_ENTRY_KEY\n  * Duration\nNever Expires\n  * Description\nThe cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.\n\n\n  * Cookie\nyt-remote-device-id\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-name\n  * Duration\nsession\n  * Description\nThe yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\nyt-remote-fast-check-period\n  * Duration\nsession\n  * Description\nThe yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-app\n  * Duration\nsession\n  * Description\nThe yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-available\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-installed\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\ncp_session\n  * Duration\n3 months\n  * Description\nCodepen sets this cookie for Help systems found in the website.\n\n\n  * Cookie\nloid\n  * Duration\n1 year 1 month 4 days\n  * Description\nThis cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.\n\n\nAnalytics\nAnalytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\n  * Cookie\n__hstc\n  * Duration\n6 months\n  * Description\nHubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).\n\n\n  * Cookie\nhubspotutk\n  * Duration\n6 months\n  * Description\nHubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.\n\n\n  * Cookie\n_ga\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.\n\n\n  * Cookie\n_ga_*\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to store and count page views.\n\n\n  * Cookie\n__Host-psifi.analyticsTrace\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n__Host-psifi.analyticsTraceV2\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n_gh_sess\n  * Duration\nsession\n  * Description\nGitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.\n\n\n  * Cookie\nYSC\n  * Duration\nsession\n  * Description\nYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.\n\n\n  * Cookie\najs_anonymous_id\n  * Duration\n1 year\n  * Description\nThis cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.\n\n\n  * Cookie\nvuid\n  * Duration\n1 year 1 month 4 days\n  * Description\nVimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. \n\n\nPerformance\nPerformance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\n  * Cookie\nAWSALB\n  * Duration\n7 days\n  * Description\nAWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.\n\n\n  * Cookie\nacq\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nacq.sig\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nptc\n  * Duration\n2 years\n  * Description\nNo description available.\n\n\nAdvertisement\nAdvertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\n  * Cookie\nmuc_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to collect user behaviour and interaction data to optimize the website.\n\n\n  * Cookie\nguest_id_marketing\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\nguest_id_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\npersonalization_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.\n\n\n  * Cookie\nguest_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.\n\n\n  * Cookie\nbcookie\n  * Duration\n1 year\n  * Description\nLinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.\n\n\n  * Cookie\n__Secure-ROLLOUT_TOKEN\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.\n\n\n  * Cookie\nyt.innertube::nextId\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nyt.innertube::requests\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nsession_tracker\n  * Duration\nsession\n  * Description\nThis cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.\n\n\n  * Cookie\nedgebucket\n  * Duration\nsession\n  * Description\nReddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.\n\n\n  * Cookie\ndid\n  * Duration\n1 year\n  * Description\nArbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.\n\n\nUncategorised\nOther uncategorised cookies are those that are being analysed and have not been classified into a category as yet.\nNo cookies to display.\nReject All Save My Preferences Accept All\nToggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n[Large Language Models](https://towardsdatascience.com/category/artificial-intelligence/large-language-models/)\n# A Comprehensive Guide to Collaborative AI Agents in Practice\nthe definition, and building a team of agents that refine your CV and Cover Letter for job applications\n[Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\nJuly 3, 202414 min read\n### A look at the definition, and building a team of AI agents that refine your CV and Cover Letter for job applications\n![Image created by DALLE3.](../images/000.jpeg)\nImage created by DALLE3.\n> Not a member? [Read for free!](https://hesamsheikh.substack.com/)\nAgentic AI is one of the hottest subjects of the AI community in 2024 and there is a good reason for that. Foundational Models are becoming more sophisticated in **reasoning** and **planning**. With these capabilities in place, we can leverage LLMs to divide a given task into smaller pieces, perform them step by step, and reflect on their results, essentially creating **AI Agents**.\nIf you're passionate about AI, or you like playing with Language Models, or you're working in Machine Learning, a comprehensive understanding of AI agents and how they look in action is necessary if you want to keep up with the latest AI achievements.\nIf you're in the job search process as I am, you know that writing a cover letter for each job you apply to or adjusting the CV to pinpoint job requirements is a tedious step. For my implementation of AI agents, **I will develop a team of AI agents** that collaborate to:\nLearn this step by step with the interactive [AI Engineer](https://roadmap.sh/ai-engineer) and [Machine Learning](https://roadmap.sh/machine-learning) roadmaps.\n  * **Extract** the key information out of a job description\n  * **Modify** your CV and Cover Letter to address the job\n  * **Evaluate** the final result from a recruiter's point of view, and give you a score from 0 to 100\n\n\n![Fig 1. We will create a team of AI agents to modify our CV and Cover Letter and give us a score from 0 to 100. \\(by Author\\)](../images/001.png)\nFig 1. We will create a team of AI agents to modify our CV and Cover Letter and give us a score from 0 to 100. (by Author)\nIn this article, we will walk through what collaborative AI agents are, what makes agents different from LLMs, and go through a practical implementation to showcase how creating AI agents might be much simpler than you would expect.\n· [AI Agent Made Simple](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#d3a2) ∘ [LLM-Powered AI Agents](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#80e7) · [Multi-Agent Collaboration](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#3ee0) ∘ [What Makes an Agent](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#4bb1) ∘ [What We Need With Multi-Agents](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#3481) · [Code Implementation: Agents that Help You Apply For Jobs](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#151a)\n## AI Agent Made Simple\nAI agent is a goal-oriented tool crafted to accomplish a specific set of tasks. While AI language models are created to generate responses for specific prompts, AI agents operate on a broader scale by addressing complex problems through decision-making and task execution. They reason upon a mission, and by using their available tools, execute smaller agendas to finish the task.\n> AI chatbots speak, AI agents act.\nWhether in customer service, finance, or software development, AI agents are made for one thing: **automation**. The hope is that AI agents help individuals and organizations with their mundane routines, with lower costs to solving less creative agendas.\n![Fig 2. The outline of how a model LLM-based agent is structured. \\(Source: Wikimedia\\)](../images/002.png)\nFig 2. The outline of how a model LLM-based agent is structured. (Source: [Wikimedia](https://commons.wikimedia.org/wiki/File:AI_Agent_Overview.png))\n### LLM-Powered AI Agents\nEven though AI Agents are very different from Large Language Models, **LLMs are the brains of our AI agents**. Agents need LLMs to do anything intelligently, reason, and plan their next steps. This means that which LLM you use, changes the behavior of the agent completely. This is why the rise of AI agents topic was made possible by the surge of Gen-AI.\n**Note** : The AI agents we hear about today have a somewhat different meaning than the traditional literature and textbooks. This can get confusing if you're simply searching about AI agents, and you get diverse definitions of what they are. The AI agents we use today, and are the trending topic of the AI community, are LLM-based agents that we are discussing in this article.\n![Fig 3. \\(by Author\\)](../images/003.png)\nFig 3. (by Author)\nAt their core, autonomous AI agents benefit from three components:\n  1. **Planning:** This core function of an agent, allows it to break a goal into smaller steps and work on them one by one. Another aspect of their planning is to **self-reflect** on their actions and learn from them. The way an agent pulls off self-reflection very much depends on the implementation, but a general outline could be thought of as displayed in Figure 4.\n  2. **Memory:** To learn from past mistakes, you must remember them. Memory is the component of storing, and later retrieving information by the agent, to refine its actions.\n  3. **Tool Use:** A key differentiating factor between a simple LLM and an AI agent, is their ability to use tools. Using tools can be as simple as calling an API, or using a Python function to read or write some files.\n\n\n![Fig 4. Self-reflection is a finite loop between the agent thinking what to do, acting on it, and observing the results, potentially taking a new approach to the problem. \\(by Author\\)](../images/004.png)\nFig 4. Self-reflection is a finite loop between the agent thinking what to do, acting on it, and observing the results, potentially taking a new approach to the problem. (by Author)\n## Multi-Agent Collaboration\nWhat is better than a single agent? **Many of them!**\nHaving one AI agent is one thing, but having multiple AI agents that collaborate with each other to chop up tasks and act on them is another story.\nBut why do we **NEED** multiple agents?\nWhen breaking a goal down into smaller parts, you end up with sub-goals that require different sets of skills. That's where you need multiple agents. A team of agents, with each one of them having a specific role and skillset, ensures that each sub-goal is tackled by its own agent.\nYou might even need to power each agent with a different LLM that is more sophisticated for the task to which that agent is assigned. An agent created for programming capabilities might need a completely different LLM than an agent who is supposed to write articles.\n### What Makes an Agent\nHow you would define an agent very much depends on the implementation or the library you use. In general, an agent boils down to three main elements:\n![Fig 5. \\(by Author\\)](../images/005.png)\nFig 5. (by Author)\n  1. **Goal** : The specific objective the agent aims to accomplish. This shapes its decision-making framework. For example, \"write easy-to-understand object-oriented Python code.\"\n  2. **Role** : The function of an agent. Who is it? A debugger, data scientist, sales marketer, etc.\n  3. **Backstory** : The context of the agent. Explains the goal, role, and what the agent is good at. An example of a backstory could be, \"You are a senior Python programmer with a specialization in writing optimized, well-documented code and its test cases.\"\n\n\n### What We Need With Multi-Agents\nThe implementation details of multi-agent have some nuances to consider. Imagine a team of people working towards the same goal, a team of chefs in a restaurant kitchen as an example.\n![Image created by DALLE3.](../images/006.jpeg)\nImage created by DALLE3.\nYou would need a head chef who leads the team. The team members need to communicate with each other. You need them to be able to send their finished work to the other chefs for the next step of the food preparation. This is just an example of how many things are needed to make multiple agents **collaborate toward a shared assignment.**\nGenerally, with multiple agents, you would need:\n  1. **Sharing Information** : Agents need to pass their results to each other and share their findings. An agent's finished work might be the input of another agent to start their task.\n  2. **Collaboration** : Agents should be able to use each other's help and delegate parts of their work if needed. This might not be a must in simple scenarios, but in complex processes, it is pretty necessary.\n  3. **Manager Agent** : Controls the flow of tasks between the agents, keeping them in control.\n\n\n## Code Implementation: Agents that Help You Apply For Jobs\nNow let's create our team of agents. There are multiple libraries that enable you to develop AI agents, such as [LlamaIndex ](https://www.llamaindex.ai/)or [LangChain](https://www.langchain.com/). I will use [CrewAI](https://www.crewai.com/) for its easy-to-use workflow and high level of abstraction. It's free to use and while giving you adequate control over your agents, saves you from unnecessary complexity in simple projects.\nI will create a team of agents to help me modify my CV and Cover Letter for a given job description to evaluate the final result and see how much I will have the chance of getting an interview. For this purpose, I will create **four** agents:\n  1. **Job Crawler** : This agent will receive the URL of the job posting, crawl the webpage, and extract the key information about the job requirements, qualifications, etc.\n  2. **CV Modifier** : Based on the key information about the job, provided by Job Crawler, this agent reads my CV and enhances it to better fit the job description.\n  3. **Cover Letter Modifier:** This works the same as CV Modifier, but works on my cover letter instead.\n  4. **Recruiter:** Acts as the job recruiter and analyzes my modified CV and cover letter. It will give me feedback and also a score in the range [0–100].\n\n\n![Fig 6. Outline of the agent workflow. \\(by Author\\)](../images/007.png)\nFig 6. Outline of the agent workflow. (by Author)\nFor the LLM, we will use `gpt-4-turbo` . However, using Ollama, you can run LLMs **100% locally** and **free**. I will not go into details in this article, but to know how you can run `LLama-3`, `Mistral`, `Phi-3`, and many more models locally on your machine, read this article:\n> [**🚀 Build Your First AI Agent in 5 Easy Steps (100% local)**](https://pub.towardsai.net/build-your-first-ai-agent-in-5-easy-steps-100-local-2fb771438a8f)\nNext, I will load my `OPENAI_API_KEY` and initialize my `model`. This model is the backbone of our agents' reasoning:\npython\n\n```\nfrom dotenv import load_dotenv\nfrom crewai import Agent, Task, Crew, Process\nfrom langchain_openai import ChatOpenAI\nfrom langchain.tools import tool\nimport re\n\n# Load your OPENAI_API_KEY from your .env file\nload_dotenv()\n\n# The model for the agents\nmodel = ChatOpenAI(model_name=\"gpt-4-turbo\", temperature=0.8)\n```\n\nWe will also need to define two **tools** that our agents need to use. Tools are what agents use to execute certain tasks. Writing custom tools for agents is as simple as a Python function. All you need to do is to wrap it with the langchain's tool decorator. The tools we need for this project are one for getting the page content by a given URL and one for reading the `CV.pdf` and `Cover Letter.pdf` content.\npython\n\n```\nfrom langchain_community.document_loaders import PyMuPDFLoader\nimport requests\n\n# Tool for loading and reading a PDF locally\n@tool\ndef fetch_pdf_content(pdf_path: str):\n    \"\"\"\n    Reads a local PDF and returns the content \n    \"\"\"\n    loader = PyMuPDFLoader(pdf_path)\n    data = loader.load()[0]\n    return data.page_content\n\n# Tool for loading a webpage\n@tool\ndef get_webpage_contents(url: str):\n    \"\"\"\n    Reads the webpage with a given URL and returns the page content\n    \"\"\"\n    try:\n        response = requests.get(url)\n        response.raise_for_status()  # Check for HTTP errors\n        return response.text\n    except requests.exceptions.RequestException as e:\n        return str(e)\n```\n\nHaving my model and the needed tools ready, next is to define my agents. Agents in CrewAI need three main attributes, the **role** , the **goal** , and the **backstory**. For each agent, we will specify a set of needed tools. Agents also have the option to delegate part of their tasks to other agents, but since this project is not that complex, we set `allow_delegation` to False for all of our agents.\npython\n\n```\njob_crawler = Agent(\n    role='Job Description Crawler',\n    goal='Extract the relevant job description, requirements and qualificiations',\n    backstory='Specialized in parsing HTML and retrieving important information from it',\n    verbose=True,\n    tools=[get_webpage_contents],\n    allow_delegation=False,\n    llm=model\n)\n\ncv_modifier = Agent(\n    role='CV/Resume Writer',\n    goal='Write a top-notch CV that increases the chance of landing an interview',\n    backstory='Expert in writing CV that is best recieved by the recruiting team and HR',\n    verbose=True,\n    tools=[fetch_pdf_content],\n    allow_delegation=False,\n    llm=model\n)\n\ncover_letter_modifier = Agent(\n    role='Cover Letter Writer',\n    goal='Write an intriguing cover letter that boosts the chance of landing an interview',\n    backstory='Expert in writing Cover Letter that is best recieved by the recruiting team and HR',\n    verbose=True,\n    tools=[fetch_pdf_content],\n    allow_delegation=False,\n    llm=model\n)\n\nrecruiter = Agent(\n    role='Hiring Manager',\n    goal='Analyze how well a candidate is suited for a job description, given their CV and Cover Letter',\n    backstory='Experienced hiring manager with an especialization of giving feedback to job seekers',\n    verbose=True,\n    allow_delegation=False,\n    llm=model\n)\n```\n\nNow we need to list our tasks. A task is a specific job you want a particular agent to do. I will assign one task to each agent. I will explain the description of my task, along with specifically how I want the output of the task to be.\npython\n\n```\ndef extract_job_information(page_url):\n    return Task(\n        description=f\"Given this url: {page_url}, extract the job description, and relative information about the job\",\n        agent=job_crawler,\n        expected_output=\"Key points of the job description, requirements, and qualifications needed for the job\",\n    )\n\ndef cv_modifying(cv_path):\n    return Task(\n        description=f\"Read the CV at this local path: {cv_path}, then\n        modify the keypoints and the order of the skills, to make it emphasize what is needded by the job.\n        Do NOT add any extra skill or new information, keep it honest.\",\n        agent=cv_modifier,\n        expected_output=\"A modified version of CV, tailor-made for the job description\",\n    )\n\ndef cover_letter_modifying(cv_path):\n    return Task(\n        description=f\"Read the cover letter at this local path: {cv_path},\n        then baseed on the provided job description by 'job_crawler' agent, \n        modify it to make it target the provided job description. Fill in the empty brackets with the company name.\n        Do NOT add any extra skill or new information, keep it honest.\",\n        agent=cover_letter_modifier,\n        expected_output=\"A modified version of cover letter, tailor-made for the job description\",\n    )\n\nevaluate = Task(\n        description=f\"Provided the modified CV and Cover Letter, and the key points of the job description,\n        give a score to the candidate from 0-100, based on how well suited they are for this job\",\n        agent=recruiter,\n        expected_output=\"Score in the range [0-100]\",\n    )\n```\n\nNotice, that some of these tasks depend on the output of another one. For example, I would need both the modified CV and cover letter to evaluate them. And I also won't be able to modify my CV and cover letter, unless the _Job Crawler_ agent has successfully extracted the job information off of the webpage.\nYou have to be aware though, that ultimately you're extracting key job information from external website content. It would be the best practice to keep the website rights/copyrights in mind when using such tools for personal or commercial use.\nThis is taken care of by CrewAI automatically, by ensuring agents share the needed information with each other.\nWhat remains is to create my crew of agents, and start them off!\npython\n\n```\n# USER INPUTS\ncover_letter_path = r'Cover Letter.pdf'\ncv_path = r'CV.pdf'\njob_url = [www.job.com]\n\nextract_job_information_task = extract_job_information(job_url)\ncv_modifying_task = cv_modifying(cv_path)\ncover_letter_modifying_task = cover_letter_modifying(cover_letter_path)\n\n# make the crew\ncrew = Crew(\n    agents=[job_crawler, cv_modifier, cover_letter_modifier, recruiter],\n    tasks=[\n    extract_job_information_task,\n    cv_modifying_task,\n    cover_letter_modifying_task,\n    evaluate\n    ],\n    verbose=2\n)\n\n# Let's start!\nresult = crew.kickoff()\n```\n\nThis block of code takes the user input about the path of needed files and the webpage. Then I would create my crew, using the agents and the tasks I have defined earlier and I kick them off!\nThe result is a long output of all the thought processes and results of our agents. To keep it short, I will put a sample of the thought process of my `Cover Letter Modifier` agent:\npython\n\n```\n\n> Entering new CrewAgentExecutor chain...\nI need to read the content of the cover letter from the provided PDF file to understand its structure and content. This will help modify it according to the job description.\n\nAction: fetch_pdf_content\nAction Input: {\"pdf_path\": \"Cover Letter.pdf\"} \n\nDear Hiring Manager, \n[Original cover letter, excluded for brevity]\nSincerely, \n\nThought:\nNow I have the content of the original cover letter. I need to tailor this cover letter to specifically address the job opening at Huawei's AI4Sec Research Team. I will adjust the content to highlight relevant experiences and skills that align with the job description provided.\n\nFinal Answer:\nDear Hiring Manager,\n[Modified cover letter, excluded for brevity]\nSincerely,\n```\n\nYou could see the agent's reasons with itself, identifying what needs to be done and executing using the tools at hand.\nAfter each of our agents has finished their assignments, we can see their output and how they have performed.\n![Fig 7. Template Cover Letter vs modified by the agent. \\(by Author\\)](../images/008.png)\nFig 7. Template Cover Letter vs modified by the agent. (by Author)\nYou can see that the Cover Letter Modifier agent has successfully refined my cover letter to fit the job description, and even added some points that are emphasized in the job description. However, the CV Modifier agent's output was a bit underwhelming, requiring some adjustments to its agent and task definitions.\nThe recruiter agent has also gone through my modified CV and cover letter and assigned a score of **92/100:**\nvbnet\n\n```\nBased on the detailed review of Hesam Sheikh Hassani's CV and Cover Letter in relation to the key points of the job descriptionfor the AI Researcher position at [Excluded Intentionally], I would score the candidatea 92 out of 100. Hesam exhibits a strong academic and professional background in Artificial Intelligence, particularly in machine learningand deep learning, which aligns well with the requirements of the [Excluded Intentionally] Research Team at [Excluded Intentionally].His experience with Large Language Models (LLMs) and his ability to communicate complex AI concepts effectively, as demonstrated through his engagement on social media and articles, are particularly impressiveand directly relevant to the position. His technical proficiency with tools critical for the role, such as Git, Linux, Python, and advanced machine learning algorithms, further strengthens his candidacy.Hesam's previous roles and projects, such as the Agricultural Sorting Machineat PFK and his work on AI-on-Demand platforms, showcase his leadership skillsand his capability to manage and execute AI projects, which is essential forthe role at [Excluded Intentionally]. His expressed eagerness to contribute to and learn from[Excluded Intentionally]'s research initiatives, along with his alignment with [Excluded Intentionally]'s corevalues of continuous improvement, AI integrity, and inclusiveness, make him a strong fit culturally and professionally for the position.His immediate availability and willingness to relocate also add to his suitability for the role, ensuring a smooth transition and immediate contribution to the team. Thus, given Hesam Sheikh Hassani's strong alignment with both the technical and cultural aspects of the AI Researcher position at [Excluded Intentionally], he is highly recommended for this role with a score of 92.\n```\n\nThe example use case of AI agents to modify CVs and cover letters is only to emphasize the scope of how we can use AI to automate repetitive tasks and holds as an educational example. If you want to use such tools in practice, it would be best to keep in mind some limitations:\n  * AI-generated CV or Cover Letter might be considered a **red flag** by the recruiter. The hiring managers could potentially employ AI detection tools to eliminate such candidate applications.\n  * AI tools such as ChatGPT still fall into the trap of **CV language**. Some of the writing styles and word choices of AI in CV are easily detectable. Words such as \"delve\" or \"spearhead\" might give off an AI-generated text. This writing style could make your CV sound inauthentic and less relatable.\n\n\n> [**Why does ChatGPT use \"Delve\" so much? Mystery Solved.**](https://pub.towardsai.net/why-does-chatgpt-use-delve-400621728787)\n  * AI chatbots and LLMs suffer from **hallucinations**. In the context of this example, hallucination could mean putting experiences and skills in your cover letter and CV that you don't actually possess but were inspired by the job description. Double-check for any unrealistic modifications to your CV/cover letter.\n\n\n* * *\nHolding a firm grip on what could be done with LLMs puts companies and experts in a superior position. One such fascinating capability is AI agents. In this article, we walked through what an AI agent is, how it is different from an LLM, and how we can implement them with a few lines of code to automate our repetitive tasks.\n**🌟 Join +1000 people learning about** Python, ML / MLOps / AI, Data Science, and LLM. [**follow me**](https://medium.com/@itshesamsheikh/subscribe) and check out my **X/Twitter** , where I keep you updated Daily**.**\nThanks for reading,\n— Hesam\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](../images/body-2e861118b1a56d435c93.png)\nWritten By\n## [Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\n[See all from Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\n[Ai Agent](https://towardsdatascience.com/tag/ai-agent/)[Hands On Tutorials](https://towardsdatascience.com/tag/hands-on-tutorials/)[Large Language Models](https://towardsdatascience.com/tag/large-language-models/)[Llm](https://towardsdatascience.com/tag/llm/)[Machine Learning](https://towardsdatascience.com/tag/machine-learning/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&title=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&title=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&text=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](../images/009.jpeg)](https://towardsdatascience.com/how-to-use-pycaret-the-library-for-lazy-data-scientists-91343f960bd2/)\n## [How to use PyCaret - the library for low-code ML](https://towardsdatascience.com/how-to-use-pycaret-the-library-for-lazy-data-scientists-91343f960bd2/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nTrain, visualize, evaluate, interpret, and deploy models with minimal code.\n[Amol Mavuduru](https://towardsdatascience.com/author/amolmavuduru/)\nFebruary 25, 202110 min read\n  * [![](../images/010.png)](https://towardsdatascience.com/visualizations-of-embeddings-2910580df7f4/)\n## [Visualizations of Embeddings](https://towardsdatascience.com/visualizations-of-embeddings-2910580df7f4/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nI submitted my first paper on AI in 1990 to a small, local conference - the \"Midwest Artificial Intelligence and Cognitive Science...\n[Douglas Blank](https://towardsdatascience.com/author/doug.blank/)\nMay 27, 20237 min read\n  * [![](../images/011.png)](https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69/)\n## [Target-encoding Categorical Variables](https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nOne nice alternative to One-hot encoding your categories\n[Vinicius Trevisan](https://towardsdatascience.com/author/vinicius_trevisan/)\nMarch 17, 20227 min read\n  * [![](../images/012.jpeg)](https://towardsdatascience.com/defending-the-data-science-masters-e2013a9e029b/)\n## [Defending the Data Science Masters](https://towardsdatascience.com/defending-the-data-science-masters-e2013a9e029b/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nConsiderations in Favor of Post-Graduate Degrees Specifically for Data Science\n[Benjamin Schmidt](https://towardsdatascience.com/author/ben.schmidt0/)\nSeptember 30, 20207 min read\n  * [![](../images/013.png)](https://towardsdatascience.com/large-graph-analysis-with-pagerank-e571e3dec8ed/)\n## [Visualised Explanation of PageRank](https://towardsdatascience.com/large-graph-analysis-with-pagerank-e571e3dec8ed/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nDiscover how Google search engine ranks documents based on their link structure\n[Slava Efimov](https://towardsdatascience.com/author/slavahead/)\nAugust 9, 202315 min read\n  * [![](../images/body-63beb50f664a055ed739.jpg)](https://towardsdatascience.com/active-learning-for-classification-models-de4dc9c3f612-2/)\n## [Active Learning for classification models](https://towardsdatascience.com/active-learning-for-classification-models-de4dc9c3f612-2/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nThe implementation of 2 active learning algorithms and their usage in SuperAnnotate's platform.\n[Martun Karapetyan](https://towardsdatascience.com/author/martunkarapetyan/)\nNovember 18, 20200 min read\n  * [![](../images/015.png)](https://towardsdatascience.com/how-to-do-cross-validation-effectively-1bbeb1d69ee8/)\n## [How to Do Cross-Validation Effectively](https://towardsdatascience.com/how-to-do-cross-validation-effectively-1bbeb1d69ee8/)\n[Deep Learning](https://towardsdatascience.com/category/artificial-intelligence/deep-learning/)\nA guide to cross-validation best practices: re-training and nesting\n[Vitor Cerqueira](https://towardsdatascience.com/author/vcerq/)\nFebruary 6, 20236 min read\n  * [![](../images/016.png)](https://towardsdatascience.com/vall-e-the-future-of-text-to-speech-d090b6ede07b/)\n## [VALL-E - The Future of Text to Speech?](https://towardsdatascience.com/vall-e-the-future-of-text-to-speech-d090b6ede07b/)\n[Deep Learning](https://towardsdatascience.com/category/artificial-intelligence/deep-learning/)\nA paper walkthrough of the new text-to-speech model by Microsoft Research\n[Elad Rapaport](https://towardsdatascience.com/author/erap129/)\nApril 14, 202316 min read\n  * [![](../images/017.jpg)](https://towardsdatascience.com/let-us-extract-some-topics-from-text-data-part-i-latent-dirichlet-allocation-lda-e335ee3e5fa4/)\n## [Let us Extract some Topics from Text Data - Part I: Latent Dirichlet Allocation (LDA)](https://towardsdatascience.com/let-us-extract-some-topics-from-text-data-part-i-latent-dirichlet-allocation-lda-e335ee3e5fa4/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nLearn what topic modelling entails and its implementation using Python's nltk, gensim, sklearn, and pyLDAvis packages\n[Seungjun (Josh) Kim](https://towardsdatascience.com/author/joshnjuny/)\nNovember 3, 202213 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\n####  Recommended Articles \nClose\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ \"How Relevance Models Foreshadowed Transformers for NLP\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ \"Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ \"The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/3660/image?etag=1780176246070&width=500&height=500) Does Your Company Have a Data Strategy? ](https://towardsdatascience.com/does-your-company-have-a-data-strategy-e8944dbec4ae/ \"Does Your Company Have a Data Strategy?\")\n\n\n",
  "metadata": {
    "title": "A Comprehensive Guide to Collaborative AI Agents in Practice | Towards Data Science",
    "description": "the definition, and building a team of agents that refine your CV and Cover Letter for job applications",
    "keywords": null,
    "author": "Hesam Sheikh",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "A Comprehensive Guide to Collaborative AI Agents in Practice",
    "og:description": "the definition, and building a team of agents that refine your CV and Cover Letter for job applications",
    "og:url": "https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/",
    "og:site_name": "Towards Data Science",
    "og:image": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1enxKj0VEHcec6IewiDat4g.jpeg",
    "og:image:width": "2048",
    "og:image:height": "2048",
    "og:image:type": "image/jpeg",
    "twitter:card": "summary_large_image",
    "twitter:site": "@TDataScience",
    "twitter:creator": "@TDataScience",
    "twitter:label1": "Written by",
    "twitter:data1": "Hesam Sheikh",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "14 min read",
    "article:published_time": "2024-07-03T17:48:15.000Z",
    "article:modified_time": "2024-07-03T17:48:15.000Z",
    "article:author": "https://towardsdatascience.com/author/itshesamsheikh/"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_000.txt",
      "chars": 312
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_001.txt",
      "chars": 694
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_002.txt",
      "chars": 1309
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_003.txt",
      "chars": 1588
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_004.txt",
      "chars": 558
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_005.txt",
      "chars": 755
    },
    {
      "language": "txt",
      "file": "attachments/6006772dccc6/code/block_006.txt",
      "chars": 1847
    }
  ],
  "images": [
    {
      "status": "http_404",
      "url": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500",
      "src": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500",
      "alt": "",
      "downloaded": false,
      "discovery": "saved_markdown",
      "retried_at": "2026-10-20T18:05:36Z"
    },
    {
      "status": "http_404",
      "url": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500",
      "src": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500",
      "alt": "",
      "downloaded": false,
      "discovery": "saved_markdown",
      "retried_at": "2026-10-20T18:05:36Z"
    },
    {
      "status": "http_404",
      "url": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500",
      "src": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500",
      "alt": "",
      "downloaded": false,
      "discovery": "saved_markdown",
      "retried_at": "2026-10-20T18:05:36Z"
    },
    {
      "status": "http_404",
      "url": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/3660/image?etag=1780176246070&width=500&height=500",
      "src": "https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/3660/image?etag=1780176246070&width=500&height=500",
      "alt": "",
      "downloaded": false,
      "discovery": "saved_markdown",
      "retried_at": "2026-10-20T18:05:36Z"
    }
  ],
  "audio": [],
  "videos": [
    {
      "url": "https://www.youtube.com/c/TowardsDataScience",
      "kind": "channel_reference",
      "status": "reference_only"
    }
  ],
  "links": [
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/latest/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/editors-pick/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/the-variable/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/shipai/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/submissions/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/artificial-intelligence/large-language-models/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/itshesamsheikh/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/ai-agent/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/hands-on-tutorials/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/large-language-models/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/llm/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/machine-learning/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/how-to-use-pycaret-the-library-for-lazy-data-scientists-91343f960bd2/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/artificial-intelligence/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/amolmavuduru/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/visualizations-of-embeddings-2910580df7f4/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/doug.blank/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69/"
    },
    {
      "type": "external",
      "href": "https://write.insightmediagroup.io"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/company/towards-data-science/"
    },
    {
      "type": "external",
      "href": "https://x.com/TDataScience"
    },
    {
      "type": "external",
      "href": "https://hesamsheikh.substack.com/"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/ai-engineer"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/machine-learning"
    },
    {
      "type": "external",
      "href": "https://commons.wikimedia.org/wiki/File:AI_Agent_Overview.png"
    },
    {
      "type": "external",
      "href": "https://www.llamaindex.ai/"
    },
    {
      "type": "external",
      "href": "https://www.langchain.com/"
    },
    {
      "type": "external",
      "href": "https://www.crewai.com/"
    },
    {
      "type": "external",
      "href": "https://pub.towardsai.net/build-your-first-ai-agent-in-5-easy-steps-100-local-2fb771438a8f"
    },
    {
      "type": "external",
      "href": "https://pub.towardsai.net/why-does-chatgpt-use-delve-400621728787"
    },
    {
      "type": "external",
      "href": "https://medium.com/@itshesamsheikh/subscribe"
    },
    {
      "type": "external",
      "href": "https://www.facebook.com/sharer/sharer.php?title=A+Comprehensive+Guide+to+Collaborative+AI+Agents+in+Practice&u=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/shareArticle?mini=true&title=A+Comprehensive+Guide+to+Collaborative+AI+Agents+in+Practice&url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F"
    },
    {
      "type": "external",
      "href": "https://x.com/share?text=A+Comprehensive+Guide+to+Collaborative+AI+Agents+in+Practice&url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F"
    },
    {
      "type": "external",
      "href": "https://www.youtube.com/c/TowardsDataScience"
    },
    {
      "type": "external",
      "href": "https://www.threads.net/@towardsdatascience"
    },
    {
      "type": "external",
      "href": "https://bsky.app/profile/towardsdatascience.com"
    },
    {
      "type": "external",
      "href": "https://thenewstack.io"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-20T17:32:34Z",
  "source_url": "https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/",
  "delivery_status": "unverified",
  "discovery_status": "http_403",
  "missing_reason": "源页面未重新核验:http_403；已按保留正文补采图片",
  "repair_error": "",
  "actual_video_files": [],
  "expected_saved_body_images": 4,
  "image_discovery": "saved_markdown",
  "source_body_markdown": "![Revisit consent button](https://cdn-cookieyes.com/assets/images/revisit.svg)\nWe value your privacy\nWe use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \"Accept All\", you consent to our use of cookies.\nCustomise Reject All Accept All\nCustomise Consent Preferences ![](https://cdn-cookieyes.com/assets/images/close.svg)\nWe use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\nThe cookies that are categorised as \"Necessary\" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more\nNecessaryAlways Active\nNecessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\n  * Cookie\nBCTempID\n  * Duration\n10 minutes\n  * Description\nNo description available.\n\n\n  * Cookie\n__cf_bm\n  * Duration\n1 hour\n  * Description\nThis cookie, set by Cloudflare, is used to support Cloudflare Bot Management. \n\n\n  * Cookie\nAWSALBCORS\n  * Duration\n7 days\n  * Description\nAmazon Web Services set this cookie for load balancing.\n\n\n  * Cookie\n_cfuvid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services\n\n\n  * Cookie\nli_gc\n  * Duration\n6 months\n  * Description\nLinkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.\n\n\n  * Cookie\n__hssrc\n  * Duration\nsession\n  * Description\nThis cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.\n\n\n  * Cookie\n__hssc\n  * Duration\n1 hour\n  * Description\nHubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.\n\n\n  * Cookie\nwpEmojiSettingsSupports\n  * Duration\nsession\n  * Description\nWordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.\n\n\n  * Cookie\nBCSessionID\n  * Duration\n1 year 1 month 4 days\n  * Description\nBlueconic sets this cookie as a unique identifier for the BlueConic profile.\n\n\n  * Cookie\n_octo\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nlogged_in\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\n__Secure-YEC\n  * Duration\npast\n  * Description\nYouTube sets this cookie to stores the user's video player preferences using embedded YouTube video\n\n\n  * Cookie\n__eoi\n  * Duration\n6 months\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTGCORS\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\nlogin-status-p\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTG\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\ncsrf_token\n  * Duration\nsession\n  * Description\nNo description available.\n\n\n  * Cookie\ntoken_v2\n  * Duration\n1 day\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nD\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nPHPSESSID\n  * Duration\nsession\n  * Description\nThis cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.\n\n\n  * Cookie\nVISITOR_PRIVACY_METADATA\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to store the user's cookie consent state for the current domain. \n\n\n  * Cookie\ncookietest\n  * Duration\nsession\n  * Description\nThe cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.\n\n\n  * Cookie\n__Host-airtable-session\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\n__Host-airtable-session.sig\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\nm\n  * Duration\n1 year 1 month 4 days\n  * Description\nStripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.\n\n\n  * Cookie\nBIGipServer*\n  * Duration\nsession\n  * Description\nMarketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. \n\n\n  * Cookie\n__cfruid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to identify trusted web traffic.\n\n\n  * Cookie\n_GRECAPTCHA\n  * Duration\n6 months\n  * Description\nGoogle Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.\n\n\n  * Cookie\n__Secure-YNID\n  * Duration\n6 months\n  * Description\nGoogle cookie used to protect user security and prevent fraud, especially during the login process.\n\n\n  * Cookie\ncookieyes-consent\n  * Duration\n1 year\n  * Description\nCookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.\n\n\nFunctional\nFunctional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\n  * Cookie\nlidc\n  * Duration\n1 day\n  * Description\nLinkedIn sets the lidc cookie to facilitate data center selection.\n\n\n  * Cookie\nbrw\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nbrwConsent\n  * Duration\n5 minutes\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nWMF-Uniq\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nloom_anon_comment\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nloom_referral_video\n  * Duration\nsession\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nVISITOR_INFO1_LIVE\n  * Duration\n6 months\n  * Description\nA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.\n\n\n  * Cookie\nyt-remote-connected-devices\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nytidb::LAST_RESULT_ENTRY_KEY\n  * Duration\nNever Expires\n  * Description\nThe cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.\n\n\n  * Cookie\nyt-remote-device-id\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-name\n  * Duration\nsession\n  * Description\nThe yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\nyt-remote-fast-check-period\n  * Duration\nsession\n  * Description\nThe yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-app\n  * Duration\nsession\n  * Description\nThe yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-available\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-installed\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\ncp_session\n  * Duration\n3 months\n  * Description\nCodepen sets this cookie for Help systems found in the website.\n\n\n  * Cookie\nloid\n  * Duration\n1 year 1 month 4 days\n  * Description\nThis cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.\n\n\nAnalytics\nAnalytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\n  * Cookie\n__hstc\n  * Duration\n6 months\n  * Description\nHubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).\n\n\n  * Cookie\nhubspotutk\n  * Duration\n6 months\n  * Description\nHubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.\n\n\n  * Cookie\n_ga\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.\n\n\n  * Cookie\n_ga_*\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to store and count page views.\n\n\n  * Cookie\n__Host-psifi.analyticsTrace\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n__Host-psifi.analyticsTraceV2\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n_gh_sess\n  * Duration\nsession\n  * Description\nGitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.\n\n\n  * Cookie\nYSC\n  * Duration\nsession\n  * Description\nYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.\n\n\n  * Cookie\najs_anonymous_id\n  * Duration\n1 year\n  * Description\nThis cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.\n\n\n  * Cookie\nvuid\n  * Duration\n1 year 1 month 4 days\n  * Description\nVimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. \n\n\nPerformance\nPerformance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\n  * Cookie\nAWSALB\n  * Duration\n7 days\n  * Description\nAWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.\n\n\n  * Cookie\nacq\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nacq.sig\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nptc\n  * Duration\n2 years\n  * Description\nNo description available.\n\n\nAdvertisement\nAdvertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\n  * Cookie\nmuc_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to collect user behaviour and interaction data to optimize the website.\n\n\n  * Cookie\nguest_id_marketing\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\nguest_id_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\npersonalization_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.\n\n\n  * Cookie\nguest_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.\n\n\n  * Cookie\nbcookie\n  * Duration\n1 year\n  * Description\nLinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.\n\n\n  * Cookie\n__Secure-ROLLOUT_TOKEN\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.\n\n\n  * Cookie\nyt.innertube::nextId\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nyt.innertube::requests\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nsession_tracker\n  * Duration\nsession\n  * Description\nThis cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.\n\n\n  * Cookie\nedgebucket\n  * Duration\nsession\n  * Description\nReddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.\n\n\n  * Cookie\ndid\n  * Duration\n1 year\n  * Description\nArbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.\n\n\nUncategorised\nOther uncategorised cookies are those that are being analysed and have not been classified into a category as yet.\nNo cookies to display.\nReject All Save My Preferences Accept All\nToggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n[Large Language Models](https://towardsdatascience.com/category/artificial-intelligence/large-language-models/)\n# A Comprehensive Guide to Collaborative AI Agents in Practice\nthe definition, and building a team of agents that refine your CV and Cover Letter for job applications\n[Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\nJuly 3, 202414 min read\n### A look at the definition, and building a team of AI agents that refine your CV and Cover Letter for job applications\n![Image created by DALLE3.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1enxKj0VEHcec6IewiDat4g.jpeg)\nImage created by DALLE3.\n> Not a member? [Read for free!](https://hesamsheikh.substack.com/)\nAgentic AI is one of the hottest subjects of the AI community in 2024 and there is a good reason for that. Foundational Models are becoming more sophisticated in **reasoning** and **planning**. With these capabilities in place, we can leverage LLMs to divide a given task into smaller pieces, perform them step by step, and reflect on their results, essentially creating **AI Agents**.\nIf you're passionate about AI, or you like playing with Language Models, or you're working in Machine Learning, a comprehensive understanding of AI agents and how they look in action is necessary if you want to keep up with the latest AI achievements.\nIf you're in the job search process as I am, you know that writing a cover letter for each job you apply to or adjusting the CV to pinpoint job requirements is a tedious step. For my implementation of AI agents, **I will develop a team of AI agents** that collaborate to:\nLearn this step by step with the interactive [AI Engineer](https://roadmap.sh/ai-engineer) and [Machine Learning](https://roadmap.sh/machine-learning) roadmaps.\n  * **Extract** the key information out of a job description\n  * **Modify** your CV and Cover Letter to address the job\n  * **Evaluate** the final result from a recruiter's point of view, and give you a score from 0 to 100\n\n\n![Fig 1. We will create a team of AI agents to modify our CV and Cover Letter and give us a score from 0 to 100. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/11zQxaR7OuAKdxmm1Z_c1kg-1.png)\nFig 1. We will create a team of AI agents to modify our CV and Cover Letter and give us a score from 0 to 100. (by Author)\nIn this article, we will walk through what collaborative AI agents are, what makes agents different from LLMs, and go through a practical implementation to showcase how creating AI agents might be much simpler than you would expect.\n· [AI Agent Made Simple](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#d3a2) ∘ [LLM-Powered AI Agents](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#80e7) · [Multi-Agent Collaboration](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#3ee0) ∘ [What Makes an Agent](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#4bb1) ∘ [What We Need With Multi-Agents](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#3481) · [Code Implementation: Agents that Help You Apply For Jobs](https://towardsdatascience.com/a-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c/#151a)\n## AI Agent Made Simple\nAI agent is a goal-oriented tool crafted to accomplish a specific set of tasks. While AI language models are created to generate responses for specific prompts, AI agents operate on a broader scale by addressing complex problems through decision-making and task execution. They reason upon a mission, and by using their available tools, execute smaller agendas to finish the task.\n> AI chatbots speak, AI agents act.\nWhether in customer service, finance, or software development, AI agents are made for one thing: **automation**. The hope is that AI agents help individuals and organizations with their mundane routines, with lower costs to solving less creative agendas.\n![Fig 2. The outline of how a model LLM-based agent is structured. \\(Source: Wikimedia\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/0YH8NCW4D169jE1Vb-1.png)\nFig 2. The outline of how a model LLM-based agent is structured. (Source: [Wikimedia](https://commons.wikimedia.org/wiki/File:AI_Agent_Overview.png))\n### LLM-Powered AI Agents\nEven though AI Agents are very different from Large Language Models, **LLMs are the brains of our AI agents**. Agents need LLMs to do anything intelligently, reason, and plan their next steps. This means that which LLM you use, changes the behavior of the agent completely. This is why the rise of AI agents topic was made possible by the surge of Gen-AI.\n**Note** : The AI agents we hear about today have a somewhat different meaning than the traditional literature and textbooks. This can get confusing if you're simply searching about AI agents, and you get diverse definitions of what they are. The AI agents we use today, and are the trending topic of the AI community, are LLM-based agents that we are discussing in this article.\n![Fig 3. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/0sb2IkUjr2FE97UG1-1.png)\nFig 3. (by Author)\nAt their core, autonomous AI agents benefit from three components:\n  1. **Planning:** This core function of an agent, allows it to break a goal into smaller steps and work on them one by one. Another aspect of their planning is to **self-reflect** on their actions and learn from them. The way an agent pulls off self-reflection very much depends on the implementation, but a general outline could be thought of as displayed in Figure 4.\n  2. **Memory:** To learn from past mistakes, you must remember them. Memory is the component of storing, and later retrieving information by the agent, to refine its actions.\n  3. **Tool Use:** A key differentiating factor between a simple LLM and an AI agent, is their ability to use tools. Using tools can be as simple as calling an API, or using a Python function to read or write some files.\n\n\n![Fig 4. Self-reflection is a finite loop between the agent thinking what to do, acting on it, and observing the results, potentially taking a new approach to the problem. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1hZP6BiaQfyBFC4j3A4klZg-1.png)\nFig 4. Self-reflection is a finite loop between the agent thinking what to do, acting on it, and observing the results, potentially taking a new approach to the problem. (by Author)\n## Multi-Agent Collaboration\nWhat is better than a single agent? **Many of them!**\nHaving one AI agent is one thing, but having multiple AI agents that collaborate with each other to chop up tasks and act on them is another story.\nBut why do we **NEED** multiple agents?\nWhen breaking a goal down into smaller parts, you end up with sub-goals that require different sets of skills. That's where you need multiple agents. A team of agents, with each one of them having a specific role and skillset, ensures that each sub-goal is tackled by its own agent.\nYou might even need to power each agent with a different LLM that is more sophisticated for the task to which that agent is assigned. An agent created for programming capabilities might need a completely different LLM than an agent who is supposed to write articles.\n### What Makes an Agent\nHow you would define an agent very much depends on the implementation or the library you use. In general, an agent boils down to three main elements:\n![Fig 5. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1jU97q7YeOQmi5QyeG99NwQ-1.png)\nFig 5. (by Author)\n  1. **Goal** : The specific objective the agent aims to accomplish. This shapes its decision-making framework. For example, \"write easy-to-understand object-oriented Python code.\"\n  2. **Role** : The function of an agent. Who is it? A debugger, data scientist, sales marketer, etc.\n  3. **Backstory** : The context of the agent. Explains the goal, role, and what the agent is good at. An example of a backstory could be, \"You are a senior Python programmer with a specialization in writing optimized, well-documented code and its test cases.\"\n\n\n### What We Need With Multi-Agents\nThe implementation details of multi-agent have some nuances to consider. Imagine a team of people working towards the same goal, a team of chefs in a restaurant kitchen as an example.\n![Image created by DALLE3.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/10-RhztpFuc6eJZhF1fCVug-1.jpeg)\nImage created by DALLE3.\nYou would need a head chef who leads the team. The team members need to communicate with each other. You need them to be able to send their finished work to the other chefs for the next step of the food preparation. This is just an example of how many things are needed to make multiple agents **collaborate toward a shared assignment.**\nGenerally, with multiple agents, you would need:\n  1. **Sharing Information** : Agents need to pass their results to each other and share their findings. An agent's finished work might be the input of another agent to start their task.\n  2. **Collaboration** : Agents should be able to use each other's help and delegate parts of their work if needed. This might not be a must in simple scenarios, but in complex processes, it is pretty necessary.\n  3. **Manager Agent** : Controls the flow of tasks between the agents, keeping them in control.\n\n\n## Code Implementation: Agents that Help You Apply For Jobs\nNow let's create our team of agents. There are multiple libraries that enable you to develop AI agents, such as [LlamaIndex ](https://www.llamaindex.ai/)or [LangChain](https://www.langchain.com/). I will use [CrewAI](https://www.crewai.com/) for its easy-to-use workflow and high level of abstraction. It's free to use and while giving you adequate control over your agents, saves you from unnecessary complexity in simple projects.\nI will create a team of agents to help me modify my CV and Cover Letter for a given job description to evaluate the final result and see how much I will have the chance of getting an interview. For this purpose, I will create **four** agents:\n  1. **Job Crawler** : This agent will receive the URL of the job posting, crawl the webpage, and extract the key information about the job requirements, qualifications, etc.\n  2. **CV Modifier** : Based on the key information about the job, provided by Job Crawler, this agent reads my CV and enhances it to better fit the job description.\n  3. **Cover Letter Modifier:** This works the same as CV Modifier, but works on my cover letter instead.\n  4. **Recruiter:** Acts as the job recruiter and analyzes my modified CV and cover letter. It will give me feedback and also a score in the range [0–100].\n\n\n![Fig 6. Outline of the agent workflow. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1KD5LyVntzlldba5J-H-PoQ-1.png)\nFig 6. Outline of the agent workflow. (by Author)\nFor the LLM, we will use `gpt-4-turbo` . However, using Ollama, you can run LLMs **100% locally** and **free**. I will not go into details in this article, but to know how you can run `LLama-3`, `Mistral`, `Phi-3`, and many more models locally on your machine, read this article:\n> [**🚀 Build Your First AI Agent in 5 Easy Steps (100% local)**](https://pub.towardsai.net/build-your-first-ai-agent-in-5-easy-steps-100-local-2fb771438a8f)\nNext, I will load my `OPENAI_API_KEY` and initialize my `model`. This model is the backbone of our agents' reasoning:\npython\n\n```\nfrom dotenv import load_dotenv\nfrom crewai import Agent, Task, Crew, Process\nfrom langchain_openai import ChatOpenAI\nfrom langchain.tools import tool\nimport re\n\n# Load your OPENAI_API_KEY from your .env file\nload_dotenv()\n\n# The model for the agents\nmodel = ChatOpenAI(model_name=\"gpt-4-turbo\", temperature=0.8)\n```\n\nWe will also need to define two **tools** that our agents need to use. Tools are what agents use to execute certain tasks. Writing custom tools for agents is as simple as a Python function. All you need to do is to wrap it with the langchain's tool decorator. The tools we need for this project are one for getting the page content by a given URL and one for reading the `CV.pdf` and `Cover Letter.pdf` content.\npython\n\n```\nfrom langchain_community.document_loaders import PyMuPDFLoader\nimport requests\n\n# Tool for loading and reading a PDF locally\n@tool\ndef fetch_pdf_content(pdf_path: str):\n    \"\"\"\n    Reads a local PDF and returns the content \n    \"\"\"\n    loader = PyMuPDFLoader(pdf_path)\n    data = loader.load()[0]\n    return data.page_content\n\n# Tool for loading a webpage\n@tool\ndef get_webpage_contents(url: str):\n    \"\"\"\n    Reads the webpage with a given URL and returns the page content\n    \"\"\"\n    try:\n        response = requests.get(url)\n        response.raise_for_status()  # Check for HTTP errors\n        return response.text\n    except requests.exceptions.RequestException as e:\n        return str(e)\n```\n\nHaving my model and the needed tools ready, next is to define my agents. Agents in CrewAI need three main attributes, the **role** , the **goal** , and the **backstory**. For each agent, we will specify a set of needed tools. Agents also have the option to delegate part of their tasks to other agents, but since this project is not that complex, we set `allow_delegation` to False for all of our agents.\npython\n\n```\njob_crawler = Agent(\n    role='Job Description Crawler',\n    goal='Extract the relevant job description, requirements and qualificiations',\n    backstory='Specialized in parsing HTML and retrieving important information from it',\n    verbose=True,\n    tools=[get_webpage_contents],\n    allow_delegation=False,\n    llm=model\n)\n\ncv_modifier = Agent(\n    role='CV/Resume Writer',\n    goal='Write a top-notch CV that increases the chance of landing an interview',\n    backstory='Expert in writing CV that is best recieved by the recruiting team and HR',\n    verbose=True,\n    tools=[fetch_pdf_content],\n    allow_delegation=False,\n    llm=model\n)\n\ncover_letter_modifier = Agent(\n    role='Cover Letter Writer',\n    goal='Write an intriguing cover letter that boosts the chance of landing an interview',\n    backstory='Expert in writing Cover Letter that is best recieved by the recruiting team and HR',\n    verbose=True,\n    tools=[fetch_pdf_content],\n    allow_delegation=False,\n    llm=model\n)\n\nrecruiter = Agent(\n    role='Hiring Manager',\n    goal='Analyze how well a candidate is suited for a job description, given their CV and Cover Letter',\n    backstory='Experienced hiring manager with an especialization of giving feedback to job seekers',\n    verbose=True,\n    allow_delegation=False,\n    llm=model\n)\n```\n\nNow we need to list our tasks. A task is a specific job you want a particular agent to do. I will assign one task to each agent. I will explain the description of my task, along with specifically how I want the output of the task to be.\npython\n\n```\ndef extract_job_information(page_url):\n    return Task(\n        description=f\"Given this url: {page_url}, extract the job description, and relative information about the job\",\n        agent=job_crawler,\n        expected_output=\"Key points of the job description, requirements, and qualifications needed for the job\",\n    )\n\ndef cv_modifying(cv_path):\n    return Task(\n        description=f\"Read the CV at this local path: {cv_path}, then\n        modify the keypoints and the order of the skills, to make it emphasize what is needded by the job.\n        Do NOT add any extra skill or new information, keep it honest.\",\n        agent=cv_modifier,\n        expected_output=\"A modified version of CV, tailor-made for the job description\",\n    )\n\ndef cover_letter_modifying(cv_path):\n    return Task(\n        description=f\"Read the cover letter at this local path: {cv_path},\n        then baseed on the provided job description by 'job_crawler' agent, \n        modify it to make it target the provided job description. Fill in the empty brackets with the company name.\n        Do NOT add any extra skill or new information, keep it honest.\",\n        agent=cover_letter_modifier,\n        expected_output=\"A modified version of cover letter, tailor-made for the job description\",\n    )\n\nevaluate = Task(\n        description=f\"Provided the modified CV and Cover Letter, and the key points of the job description,\n        give a score to the candidate from 0-100, based on how well suited they are for this job\",\n        agent=recruiter,\n        expected_output=\"Score in the range [0-100]\",\n    )\n```\n\nNotice, that some of these tasks depend on the output of another one. For example, I would need both the modified CV and cover letter to evaluate them. And I also won't be able to modify my CV and cover letter, unless the _Job Crawler_ agent has successfully extracted the job information off of the webpage.\nYou have to be aware though, that ultimately you're extracting key job information from external website content. It would be the best practice to keep the website rights/copyrights in mind when using such tools for personal or commercial use.\nThis is taken care of by CrewAI automatically, by ensuring agents share the needed information with each other.\nWhat remains is to create my crew of agents, and start them off!\npython\n\n```\n# USER INPUTS\ncover_letter_path = r'Cover Letter.pdf'\ncv_path = r'CV.pdf'\njob_url = [www.job.com]\n\nextract_job_information_task = extract_job_information(job_url)\ncv_modifying_task = cv_modifying(cv_path)\ncover_letter_modifying_task = cover_letter_modifying(cover_letter_path)\n\n# make the crew\ncrew = Crew(\n    agents=[job_crawler, cv_modifier, cover_letter_modifier, recruiter],\n    tasks=[\n    extract_job_information_task,\n    cv_modifying_task,\n    cover_letter_modifying_task,\n    evaluate\n    ],\n    verbose=2\n)\n\n# Let's start!\nresult = crew.kickoff()\n```\n\nThis block of code takes the user input about the path of needed files and the webpage. Then I would create my crew, using the agents and the tasks I have defined earlier and I kick them off!\nThe result is a long output of all the thought processes and results of our agents. To keep it short, I will put a sample of the thought process of my `Cover Letter Modifier` agent:\npython\n\n```\n\n> Entering new CrewAgentExecutor chain...\nI need to read the content of the cover letter from the provided PDF file to understand its structure and content. This will help modify it according to the job description.\n\nAction: fetch_pdf_content\nAction Input: {\"pdf_path\": \"Cover Letter.pdf\"} \n\nDear Hiring Manager, \n[Original cover letter, excluded for brevity]\nSincerely, \n\nThought:\nNow I have the content of the original cover letter. I need to tailor this cover letter to specifically address the job opening at Huawei's AI4Sec Research Team. I will adjust the content to highlight relevant experiences and skills that align with the job description provided.\n\nFinal Answer:\nDear Hiring Manager,\n[Modified cover letter, excluded for brevity]\nSincerely,\n```\n\nYou could see the agent's reasons with itself, identifying what needs to be done and executing using the tools at hand.\nAfter each of our agents has finished their assignments, we can see their output and how they have performed.\n![Fig 7. Template Cover Letter vs modified by the agent. \\(by Author\\)](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/07/1dFvaKSIqzoIp6Igy1Tjj6A-1.png)\nFig 7. Template Cover Letter vs modified by the agent. (by Author)\nYou can see that the Cover Letter Modifier agent has successfully refined my cover letter to fit the job description, and even added some points that are emphasized in the job description. However, the CV Modifier agent's output was a bit underwhelming, requiring some adjustments to its agent and task definitions.\nThe recruiter agent has also gone through my modified CV and cover letter and assigned a score of **92/100:**\nvbnet\n\n```\nBased on the detailed review of Hesam Sheikh Hassani's CV and Cover Letter in relation to the key points of the job descriptionfor the AI Researcher position at [Excluded Intentionally], I would score the candidatea 92 out of 100. Hesam exhibits a strong academic and professional background in Artificial Intelligence, particularly in machine learningand deep learning, which aligns well with the requirements of the [Excluded Intentionally] Research Team at [Excluded Intentionally].His experience with Large Language Models (LLMs) and his ability to communicate complex AI concepts effectively, as demonstrated through his engagement on social media and articles, are particularly impressiveand directly relevant to the position. His technical proficiency with tools critical for the role, such as Git, Linux, Python, and advanced machine learning algorithms, further strengthens his candidacy.Hesam's previous roles and projects, such as the Agricultural Sorting Machineat PFK and his work on AI-on-Demand platforms, showcase his leadership skillsand his capability to manage and execute AI projects, which is essential forthe role at [Excluded Intentionally]. His expressed eagerness to contribute to and learn from[Excluded Intentionally]'s research initiatives, along with his alignment with [Excluded Intentionally]'s corevalues of continuous improvement, AI integrity, and inclusiveness, make him a strong fit culturally and professionally for the position.His immediate availability and willingness to relocate also add to his suitability for the role, ensuring a smooth transition and immediate contribution to the team. Thus, given Hesam Sheikh Hassani's strong alignment with both the technical and cultural aspects of the AI Researcher position at [Excluded Intentionally], he is highly recommended for this role with a score of 92.\n```\n\nThe example use case of AI agents to modify CVs and cover letters is only to emphasize the scope of how we can use AI to automate repetitive tasks and holds as an educational example. If you want to use such tools in practice, it would be best to keep in mind some limitations:\n  * AI-generated CV or Cover Letter might be considered a **red flag** by the recruiter. The hiring managers could potentially employ AI detection tools to eliminate such candidate applications.\n  * AI tools such as ChatGPT still fall into the trap of **CV language**. Some of the writing styles and word choices of AI in CV are easily detectable. Words such as \"delve\" or \"spearhead\" might give off an AI-generated text. This writing style could make your CV sound inauthentic and less relatable.\n\n\n> [**Why does ChatGPT use \"Delve\" so much? Mystery Solved.**](https://pub.towardsai.net/why-does-chatgpt-use-delve-400621728787)\n  * AI chatbots and LLMs suffer from **hallucinations**. In the context of this example, hallucination could mean putting experiences and skills in your cover letter and CV that you don't actually possess but were inspired by the job description. Double-check for any unrealistic modifications to your CV/cover letter.\n\n\n* * *\nHolding a firm grip on what could be done with LLMs puts companies and experts in a superior position. One such fascinating capability is AI agents. In this article, we walked through what an AI agent is, how it is different from an LLM, and how we can implement them with a few lines of code to automate our repetitive tasks.\n**🌟 Join +1000 people learning about** Python, ML / MLOps / AI, Data Science, and LLM. [**follow me**](https://medium.com/@itshesamsheikh/subscribe) and check out my **X/Twitter** , where I keep you updated Daily**.**\nThanks for reading,\n— Hesam\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](https://assets.insightmediagroup.io/media/1787657497520_1vlj6x.png)\nWritten By\n## [Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\n[See all from Hesam Sheikh](https://towardsdatascience.com/author/itshesamsheikh/)\n[Ai Agent](https://towardsdatascience.com/tag/ai-agent/)[Hands On Tutorials](https://towardsdatascience.com/tag/hands-on-tutorials/)[Large Language Models](https://towardsdatascience.com/tag/large-language-models/)[Llm](https://towardsdatascience.com/tag/llm/)[Machine Learning](https://towardsdatascience.com/tag/machine-learning/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&title=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&title=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fa-comprehensive-guide-to-collaborative-ai-agents-in-practice-1f4048947d9c%2F&text=A%20Comprehensive%20Guide%20to%20Collaborative%20AI%20Agents%20in%20Practice)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/1q1Zn-vbaMahA9kIOhVJ-kQ-scaled.jpeg)](https://towardsdatascience.com/how-to-use-pycaret-the-library-for-lazy-data-scientists-91343f960bd2/)\n## [How to use PyCaret - the library for low-code ML](https://towardsdatascience.com/how-to-use-pycaret-the-library-for-lazy-data-scientists-91343f960bd2/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nTrain, visualize, evaluate, interpret, and deploy models with minimal code.\n[Amol Mavuduru](https://towardsdatascience.com/author/amolmavuduru/)\nFebruary 25, 202110 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/05/1E0W1Ib7TMruFAQioFjU0bA.png)](https://towardsdatascience.com/visualizations-of-embeddings-2910580df7f4/)\n## [Visualizations of Embeddings](https://towardsdatascience.com/visualizations-of-embeddings-2910580df7f4/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nI submitted my first paper on AI in 1990 to a small, local conference - the \"Midwest Artificial Intelligence and Cognitive Science...\n[Douglas Blank](https://towardsdatascience.com/author/doug.blank/)\nMay 27, 20237 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/03/1fu9aFquMfd5jrYtIsIz5ww.png)](https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69/)\n## [Target-encoding Categorical Variables](https://towardsdatascience.com/dealing-with-categorical-variables-by-using-target-encoder-a0f1733a4c69/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nOne nice alternative to One-hot encoding your categories\n[Vinicius Trevisan](https://towardsdatascience.com/author/vinicius_trevisan/)\nMarch 17, 20227 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/09/19EZ6b4haDshrnSjU5ZtPMA.jpeg)](https://towardsdatascience.com/defending-the-data-science-masters-e2013a9e029b/)\n## [Defending the Data Science Masters](https://towardsdatascience.com/defending-the-data-science-masters-e2013a9e029b/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nConsiderations in Favor of Post-Graduate Degrees Specifically for Data Science\n[Benjamin Schmidt](https://towardsdatascience.com/author/ben.schmidt0/)\nSeptember 30, 20207 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/08/1wShBy-fccCAXejRwvEo8xg.png)](https://towardsdatascience.com/large-graph-analysis-with-pagerank-e571e3dec8ed/)\n## [Visualised Explanation of PageRank](https://towardsdatascience.com/large-graph-analysis-with-pagerank-e571e3dec8ed/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nDiscover how Google search engine ranks documents based on their link structure\n[Slava Efimov](https://towardsdatascience.com/author/slavahead/)\nAugust 9, 202315 min read\n  * [![](https://towardsdatascience.com/images/fallback-image.jpg)](https://towardsdatascience.com/active-learning-for-classification-models-de4dc9c3f612-2/)\n## [Active Learning for classification models](https://towardsdatascience.com/active-learning-for-classification-models-de4dc9c3f612-2/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nThe implementation of 2 active learning algorithms and their usage in SuperAnnotate's platform.\n[Martun Karapetyan](https://towardsdatascience.com/author/martunkarapetyan/)\nNovember 18, 20200 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/02/19lmVE88m5sqRSBl9lLRpKQ.png)](https://towardsdatascience.com/how-to-do-cross-validation-effectively-1bbeb1d69ee8/)\n## [How to Do Cross-Validation Effectively](https://towardsdatascience.com/how-to-do-cross-validation-effectively-1bbeb1d69ee8/)\n[Deep Learning](https://towardsdatascience.com/category/artificial-intelligence/deep-learning/)\nA guide to cross-validation best practices: re-training and nesting\n[Vitor Cerqueira](https://towardsdatascience.com/author/vcerq/)\nFebruary 6, 20236 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/04/1CUko1OJW1K8FNw8CNmEmvQ.png)](https://towardsdatascience.com/vall-e-the-future-of-text-to-speech-d090b6ede07b/)\n## [VALL-E - The Future of Text to Speech?](https://towardsdatascience.com/vall-e-the-future-of-text-to-speech-d090b6ede07b/)\n[Deep Learning](https://towardsdatascience.com/category/artificial-intelligence/deep-learning/)\nA paper walkthrough of the new text-to-speech model by Microsoft Research\n[Elad Rapaport](https://towardsdatascience.com/author/erap129/)\nApril 14, 202316 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/11/0tpnL4GKB39-idm68.jpg)](https://towardsdatascience.com/let-us-extract-some-topics-from-text-data-part-i-latent-dirichlet-allocation-lda-e335ee3e5fa4/)\n## [Let us Extract some Topics from Text Data - Part I: Latent Dirichlet Allocation (LDA)](https://towardsdatascience.com/let-us-extract-some-topics-from-text-data-part-i-latent-dirichlet-allocation-lda-e335ee3e5fa4/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nLearn what topic modelling entails and its implementation using Python's nltk, gensim, sklearn, and pyLDAvis packages\n[Seungjun (Josh) Kim](https://towardsdatascience.com/author/joshnjuny/)\nNovember 3, 202213 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\n####  Recommended Articles \nClose\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ \"How Relevance Models Foreshadowed Transformers for NLP\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ \"Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ \"The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/3660/image?etag=1780176246070&width=500&height=500) Does Your Company Have a Data Strategy? ](https://towardsdatascience.com/does-your-company-have-a-data-strategy-e8944dbec4ae/ \"Does Your Company Have a Data Strategy?\")\n\n\n",
  "body_base_path": "attachments/6006772dccc6/pages/",
  "body_markdown_path": "attachments/6006772dccc6/pages/archived-body.md",
  "local_html": "attachments/6006772dccc6/pages/archived-body.html",
  "body_source": "prior_capture"
}