<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GenAI on Atamel.Dev</title><link>https://atamel.dev/tags/genai/</link><description>Recent content in GenAI on Atamel.Dev</description><generator>Hugo</generator><language>en</language><managingEditor>atamel@gmail.com (Mete Atamel)</managingEditor><webMaster>atamel@gmail.com (Mete Atamel)</webMaster><lastBuildDate>Fri, 13 Feb 2026 13:35:28 +0000</lastBuildDate><atom:link href="https://atamel.dev/tags/genai/index.xml" rel="self" type="application/rss+xml"/><item><title>Codelab - Gemini for Developers</title><link>https://atamel.dev/posts/2026/02-13_codelab_gemini_for_developers/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2026/02-13_codelab_gemini_for_developers/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2026/codelab_gemini_for_developers.png" alt="Gemini for Developers" /&gt;
 
 &lt;figcaption&gt;Gemini for Developers&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The Gemini ecosystem has evolved into a comprehensive suite of models, tools, and APIs. Whether you are &amp;ldquo;vibe-coding&amp;rdquo; a
web app or deploying enterprise-grade agents, navigating the options can be overwhelming.&lt;/p&gt;
&lt;p&gt;I am happy to announce a new &lt;a href="https://codelabs.developers.google.com/gemini-for-developers"&gt;Gemini for Developers
codelab&lt;/a&gt;. This codelab is designed to teach you everything
you need to know about the Gemini ecosystem, from the different model flavors to tools powered by Gemini to integration
using the Google Gen AI SDK and the new Interactions API.&lt;/p&gt;</description></item><item><title>Gemini Interactions API - One interface for models and agents</title><link>https://atamel.dev/posts/2026/02-03_gemini_interactions_api/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2026/02-03_gemini_interactions_api/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://raw.githubusercontent.com/meteatamel/genai-samples/main/vertexai/interactions-api/hero_gemini_interactions_api.png" alt="Interactions API overview" /&gt;
 
 &lt;figcaption&gt;Interactions API overview&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;GenAI is rapidly moving from simple &amp;ldquo;prompt-and-response&amp;rdquo; patterns to complex, agentic workflows. To support this shift,
Google recently introduced the &lt;a href="https://ai.google.dev/gemini-api/docs/interactions"&gt;Interactions API&lt;/a&gt;, a new unified
foundation designed specifically for building with both models and agents.&lt;/p&gt;
&lt;p&gt;In this post, I’ll introduce the core concepts of the Interactions API and walk through some of the samples available in
my &lt;a href="https://github.com/meteatamel/genai-samples/tree/main/vertexai/interactions-api"&gt;genai-samples repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-is-the-interactions-api"&gt;What is the Interactions API?&lt;/h2&gt;
&lt;p&gt;Traditionally, developers had to use the Gemini API to talk to the models and another framework like Agent Development
Kit (ADK) to create and manage agents. Currently in beta, the Interactions API simplifies this by providing a single interface
for:&lt;/p&gt;</description></item><item><title>Introducing Google Cloud VertexAI Extensions for .NET</title><link>https://atamel.dev/posts/2026/01-30_introducing_vertexai_extensions_dotnet/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2026/01-30_introducing_vertexai_extensions_dotnet/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2026/introducing_vertexai_extensions_msft.png" alt="Hero image" /&gt;
 
 &lt;figcaption&gt;Hero image&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In October 2024, Microsoft
&lt;a href="https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-ai-preview/"&gt;announced&lt;/a&gt; the
&lt;a href="https://www.nuget.org/packages/Microsoft.Extensions.AI.Abstractions/"&gt;Microsoft.Extensions.AI.Abstractions&lt;/a&gt; and
&lt;a href="https://www.nuget.org/packages/Microsoft.Extensions.AI"&gt;Microsoft.Extensions.AI&lt;/a&gt; libraries for .NET. These libraries
provide the .NET ecosystem with essential abstractions for integrating AI services into .NET applications from various
providers such as Open AI, Azure, Google.&lt;/p&gt;
&lt;p&gt;Today, we’re happy to announce the
&lt;a href="https://www.nuget.org/packages/Google.Cloud.VertexAI.Extensions"&gt;Google.Cloud.VertexAI.Extensions&lt;/a&gt; library. This is the
Vertex AI implementation of &lt;strong&gt;Microsoft.Extensions.AI&lt;/strong&gt;. It enables .NET developers to integrate Google Gemini models on Vertex
AI via the &lt;strong&gt;Microsoft.Extensions.AI&lt;/strong&gt; abstractions.&lt;/p&gt;</description></item><item><title>Parallel agents in Antigravity</title><link>https://atamel.dev/posts/2026/01-19_parallel_agents_antigravity/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2026/01-19_parallel_agents_antigravity/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2026/parallel_agents_antigravity.jpg" alt="Hero image" /&gt;
 
 &lt;figcaption&gt;Hero image&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antigravity.google/"&gt;Google Antigravity&lt;/a&gt; transforms your regular IDE into an agentic development platform. In
my previous blog posts, I showed some of the unique features of Antigravity compared to a regular IDE. In today’s blog
post, I’ll talk about what makes Antigravity truly unique: &lt;strong&gt;Its ability to spin up and manage multiple agents.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="antigravity-modes"&gt;Antigravity modes&lt;/h2&gt;
&lt;p&gt;Antigravity has two modes: &lt;strong&gt;Editor&lt;/strong&gt; and &lt;strong&gt;Agent Manager&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Editor&lt;/strong&gt; is your familiar IDE with an agent on the side to help you with tasks. You can read more about it in my
previous blog post &lt;a href="https://atamel.dev/posts/2025/12-01_antigravity_editor_tips/"&gt;Google Antigravity Editor - Tips &amp;amp;
Tricks&lt;/a&gt; and learn how to provide feedback to the agent in
&lt;a href="https://atamel.dev/posts/2025/12-10_antigravity_provide_feedback/"&gt;Provide Feedback to Google Antigravity&lt;/a&gt; and how to
customize it in &lt;a href="https://atamel.dev/posts/2025/11-25_customize_antigravity_rules_workflows/"&gt;Customize Google Antigravity with rules and
workflows&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Provide Feedback to Google Antigravity</title><link>https://atamel.dev/posts/2025/12-10_antigravity_provide_feedback/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/12-10_antigravity_provide_feedback/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/antigravity_provide_feedback_outline.png" alt="Google Antigravity Provide Feedback" /&gt;
 
 &lt;figcaption&gt;Google Antigravity Provide Feedback&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;At the heart of &lt;a href="https://antigravity.google/"&gt;Google Antigravity&lt;/a&gt; is its ability to effortlessly gather your feedback
at every stage of the experience. In this blog post, I will show you all the different ways you can provide feedback
to Antigravity.&lt;/p&gt;
&lt;p&gt;As the agent works on a task, it creates different artifacts along the way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An implementation plan and a task list (before coding)&lt;/li&gt;
&lt;li&gt;Code diffs (as it generates code)&lt;/li&gt;
&lt;li&gt;A walkthrough to verify the results (after coding)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These artifacts are a way for Antigravity to communicate its plans and progress. More importantly, they&amp;rsquo;re also a way
for you to provide feedback to the agent in Google docs style comments. This is very useful to effectively steer the
agent in the direction you want.&lt;/p&gt;</description></item><item><title>Google Antigravity Editor - Tips &amp; Tricks</title><link>https://atamel.dev/posts/2025/12-01_antigravity_editor_tips/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/12-01_antigravity_editor_tips/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/antigravity_tips_and_tricks.png" alt="Google Antigravity Tips and Tricks" /&gt;
 
 &lt;figcaption&gt;Google Antigravity Tips and Tricks&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antigravity.google/"&gt;Google Antigravity&lt;/a&gt; is an agentic development platform where you have your familiar code
editor along with a powerful agent on the side. In today&amp;rsquo;s post, I want to show you some tips and tricks for the code
editor.&lt;/p&gt;
&lt;h2 id="setup-and-extensions"&gt;Setup and Extensions&lt;/h2&gt;
&lt;p&gt;In a typical setup, you&amp;rsquo;d have the editor, the terminal, and the agent visible:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/antigravity_ide.png" alt="Antigravity IDE" /&gt;
 
 &lt;figcaption&gt;Antigravity IDE&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Customize Google Antigravity with rules and workflows</title><link>https://atamel.dev/posts/2025/11-25_customize_antigravity_rules_workflows/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/11-25_customize_antigravity_rules_workflows/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://antigravity.google/assets/image/blog/introducing-antigravity-1.jpg" alt="Google Antigravity" /&gt;
 
 &lt;figcaption&gt;Google Antigravity&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antigravity.google/"&gt;Google Antigravity&lt;/a&gt; was
&lt;a href="https://antigravity.google/blog/introducing-google-antigravity"&gt;announced&lt;/a&gt; last week as the next generation agentic
IDE. I&amp;rsquo;m very impressed with it so far. It already helped me to upgrade my blog to the latest Hugo (that I&amp;rsquo;ve been
putting off for a long time). It even recognized that some of the shortcodes (eg. Twitter) from the old version changed
in the new version and automatically updated my blog posts with the new version of the shortcodes. Nice!&lt;/p&gt;</description></item><item><title>RAG just got much easier with File Search Tool in Gemini API</title><link>https://atamel.dev/posts/2025/11-14_easy_rag_file_search_tool_gemini/</link><pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/11-14_easy_rag_file_search_tool_gemini/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://storage.googleapis.com/gweb-uniblog-publish-prod/images/FileSearch-Keyword_RD2-V01.width-1200.format-webp.webp" alt="File Search Tool" /&gt;
 
 &lt;figcaption&gt;File Search Tool&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The Gemini team at Google recently
&lt;a href="https://blog.google/technology/developers/file-search-gemini-api/?utm_campaign=CDR_0xe875a906_awareness&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;announced&lt;/a&gt;
the &lt;a href="http://ai.google.dev/gemini-api/docs/file-search"&gt;File Search Tool&lt;/a&gt;, a fully managed RAG system built directly into
the Gemini API as a simple, integrated, and scalable way to ground Gemini. I gave it a try and I’m impressed how easy it
is to use to ground Gemini with your own data.&lt;/p&gt;
&lt;p&gt;In this blog post, I’ll introduce the File Search Tool and show you a concrete example.&lt;/p&gt;</description></item><item><title>Quick Guide to ADK Callbacks</title><link>https://atamel.dev/posts/2025/11-03_quick_guide_adk_callbacks/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/11-03_quick_guide_adk_callbacks/</guid><description>&lt;p&gt;I&amp;rsquo;ve been exploring the Agent Developer Kit (ADK) and its powerful callbacks feature. In this blog post, I want to outline
what callbacks are and provide a sample agent with all the callbacks implemented for a quick reference and testing.&lt;/p&gt;
&lt;p&gt;At its core, an agent framework like ADK gives you a sequence of steps:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;receive input → invoke model → invoke tools → return output&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In real-world systems, we often need to hook into these steps for logging, guarding, caching, altering prompts or
results, or dynamically changing behaviour based on session state. That’s exactly where &lt;strong&gt;callbacks&lt;/strong&gt; come in. Think of
callbacks as &amp;ldquo;checkpoints&amp;rdquo; in the agent&amp;rsquo;s lifecycle. The ADK framework automatically calls your functions at these key
stages, giving you a chance to intervene.&lt;/p&gt;</description></item><item><title>Vibe coding an AI Trivia Quest app with Google AI Studio</title><link>https://atamel.dev/posts/2025/10-27_vibe_code_ai_trivia_ai_studio/</link><pubDate>Mon, 27 Oct 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/10-27_vibe_code_ai_trivia_ai_studio/</guid><description>&lt;p&gt;A few days ago, I saw &lt;a href="https://x.com/OfficialLoganK/"&gt;Logan Kilpatrick&lt;/a&gt;’s Tweet about the new AI-first vibe coding
experience in AI Studio:&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Introducing the new AI first vibe coding experience in &lt;a href="https://twitter.com/GoogleAIStudio?ref_src=twsrc%5Etfw"&gt;@GoogleAIStudio&lt;/a&gt;! Built to take you from prompt to production with Gemini, and optimized for AI app creation. Start building AI apps for free : ) &lt;br&gt;&lt;br&gt;More updates and features to come! &lt;a href="https://t.co/HpI7Dsl8Bj"&gt;pic.twitter.com/HpI7Dsl8Bj&lt;/a&gt;&lt;/p&gt;&amp;mdash; Logan Kilpatrick (@OfficialLoganK) &lt;a href="https://twitter.com/OfficialLoganK/status/1980674135693971550?ref_src=twsrc%5Etfw"&gt;October 21, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;


&lt;p&gt;Last time I tried AI Studio for vibe coding, it was mostly a single-page web application with all the code in a single
file (which wasn’t ideal).&lt;/p&gt;</description></item><item><title>Introducing Google Gen AI .NET SDK</title><link>https://atamel.dev/posts/2025/10-23_intro_google_genai_dotnet_sdk/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/10-23_intro_google_genai_dotnet_sdk/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image.max-2500x2500.jpg" alt="Introducing Google Gen AI .NET SDK" /&gt;
 
 &lt;figcaption&gt;Introducing Google Gen AI .NET SDK&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Last year, we
&lt;a href="https://medium.com/google-cloud/gemini-on-vertex-ai-and-google-ai-now-unified-with-the-new-google-gen-ai-sdk-094a7ebca8e6"&gt;announced&lt;/a&gt;
the &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/sdks/overview"&gt;Google Gen AI SDK&lt;/a&gt; as the new unified library
for Gemini on Google AI (via the &lt;a href="https://ai.google.dev/gemini-api/docs"&gt;Gemini Developer API&lt;/a&gt;) and Vertex AI (via the
&lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview"&gt;Vertex AI API&lt;/a&gt;). At the time, it was only a
&lt;strong&gt;Python&lt;/strong&gt; SDK. Since then, the team has been busy adding support for &lt;strong&gt;Go&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, and &lt;strong&gt;Java&lt;/strong&gt; but my favorite
language, &lt;strong&gt;C#&lt;/strong&gt;, was missing until now.&lt;/p&gt;</description></item><item><title>Search Flights with Gemini Computer Use model</title><link>https://atamel.dev/posts/2025/10-20_gemini_computer_use_flights/</link><pubDate>Mon, 20 Oct 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/10-20_gemini_computer_use_flights/</guid><description>&lt;p&gt;Earlier this month, the Gemini 2.5 Computer Use model was
&lt;a href="https://blog.google/technology/google-deepmind/gemini-computer-use-model/"&gt;announced&lt;/a&gt;. This model is specialized in
interacting with graphical user interfaces (UI). This is useful in scenarios where a structured API does not exist for
the model to interact with (via function calling). Instead, you can use the Computer Use model to directly interact with
user interfaces such as filling and submitting forms.&lt;/p&gt;
&lt;p&gt;It’s important to note that the model does not interact with the UI directly. As input, the model receives the user
request, a screenshot of the environment, and a history of recent actions. As output, it generates a function call
representing a UI action such as clicking or typing (see the &lt;a href="https://ai.google.dev/gemini-api/docs/computer-use#supported-actions"&gt;full list of supported UI
actions&lt;/a&gt;). It’s the client-side code’s
responsibility to execute the received action and the process continues in a loop:&lt;/p&gt;</description></item><item><title>Secure your LLM apps with Google Cloud Model Armor</title><link>https://atamel.dev/posts/2025/08-11_secure_llm_model_armor/</link><pubDate>Mon, 11 Aug 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/08-11_secure_llm_model_armor/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/model-armor.png" alt="Model armor" /&gt;
 
 &lt;figcaption&gt;Model armor&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;It’s crucial to secure inputs and outputs to and from your Large Language Model (LLM). Failure to do so can result in
prompt injections, jailbreaking, sensitive information exposure, and more (as detailed in &lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/"&gt;OWASP Top 10 for
Large Language Model Applications&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I previously talked about &lt;a href="https://atamel.dev/posts/2024/11-11_llmguard_vertexai/"&gt;LLM Guard and Vertex AI&lt;/a&gt; and showed
how to use &lt;a href="https://github.com/protectai/llm-guard"&gt;LLM Guard&lt;/a&gt; to secure LLMs. Google Cloud has its own service to secure
LLMs: Model Armor. In this post, we&amp;rsquo;ll explore Model Armor and see how it can help to safeguard your LLM applications.&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - Multimodal Metrics</title><link>https://atamel.dev/posts/2025/08-05_genai_eval_service_multimodal_metrics/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/08-05_genai_eval_service_multimodal_metrics/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/multimodal-metrics.png" alt="Multimodal metrics" /&gt;
 
 &lt;figcaption&gt;Multimodal metrics&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This is the sixth and final post in my &lt;strong&gt;Vertex AI Gen AI Evaluation Service blog post series.&lt;/strong&gt; In the previous posts,
we covered computation-based, model-based, tool-use, and agent metrics. These metrics measure different aspects of an LLM
response in different ways but one thing they all had in common: they are all for &lt;strong&gt;text-based outputs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;LLMs nowadays also produce multimodal (images, videos) outputs. &lt;strong&gt;How do you evaluate multimodal outputs?&lt;/strong&gt; That’s the topic
of this blog post.&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - Agent Metrics</title><link>https://atamel.dev/posts/2025/08-01_genai_eval_service_agent_metrics/</link><pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/08-01_genai_eval_service_agent_metrics/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/agent-metrics.png" alt="Agent metrics" /&gt;
 
 &lt;figcaption&gt;Agent metrics&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2025/07-28_genai_eval_service_tool_metrics/"&gt;Gen AI Evaluation Service - Tool-Use Metrics
post&lt;/a&gt;, we talked about LLMs calling external tools
and how you can use tool-use metrics to evaluate how good those tool calls are. In today’s fifth post of my &lt;strong&gt;Vertex AI
Gen AI Evaluation Service blog post series&lt;/strong&gt;, we will talk about a related topic: agents and agent metrics.&lt;/p&gt;
&lt;h2 id="what-are-agents"&gt;What are agents?&lt;/h2&gt;
&lt;p&gt;There are many definitions of agents but an agent is essentially a piece of software that acts autonomously to achieve
specific goals. They use LLMs to perform tasks, utilize external tools, coordinate with other agents, and ultimately
produce a response to the user.&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - Tool-Use Metrics</title><link>https://atamel.dev/posts/2025/07-28_genai_eval_service_tool_metrics/</link><pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/07-28_genai_eval_service_tool_metrics/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/tool-use-metrics.png" alt="Tool-use metrics" /&gt;
 
 &lt;figcaption&gt;Tool-use metrics&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I’m continuing my Vertex AI Gen AI Evaluation Service blog post series. In today’s fourth post of the series, I will
talk about tool-use metrics.&lt;/p&gt;
&lt;h2 id="what-is-tool-use"&gt;What is tool use?&lt;/h2&gt;
&lt;p&gt;Tool use, also known as function calling, provides the LLM with definitions of external tools (for example, a
&lt;code&gt;get_current_weather&lt;/code&gt; function). When processing a prompt, the model determines if a tool is needed and, if so, outputs
structured data specifying the tool to call and its parameters (for example, &lt;code&gt;get_current_weather(location='London')&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - Model-Based Metrics</title><link>https://atamel.dev/posts/2025/07-08_genai_eval_service_model_metrics/</link><pubDate>Tue, 08 Jul 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/07-08_genai_eval_service_model_metrics/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_s3RjOGV.max-1700x1700.png" alt="Model-based metrics" /&gt;
 
 &lt;figcaption&gt;Model-based metrics&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://atamel.dev/posts/2025/06-30_genai_eval_service_overview/"&gt;Gen AI Evaluation Service - An Overview&lt;/a&gt;
post, I introduced Vertex AI’s &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/evaluation-overview?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;Gen AI evaluation
service&lt;/a&gt;
and talked about the various classes of metrics it supports. In the &lt;a href="https://atamel.dev/posts/2025/07-02_genai_eval_service_comp_metrics/"&gt;Gen AI Evaluation Service - Computation-Based
Metrics&lt;/a&gt; post, we delved into &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/determine-eval#computation-based-metrics?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;computation-based
metrics&lt;/a&gt;,
what they provide, and discussed their limitations. In today’s third post of the series, we’ll dive into &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/determine-eval#model-based-metrics?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;model-based
metrics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea of &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/determine-eval#model-based-metrics?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;model-based
metrics&lt;/a&gt;
is to use a judge model to evaluate the output of a candidate model. Using an LLM as a judge allows more flexible and
rich evaluations that the computational/statistical metrics fail to do.&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - Computation-Based Metrics</title><link>https://atamel.dev/posts/2025/07-02_genai_eval_service_comp_metrics/</link><pubDate>Wed, 02 Jul 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/07-02_genai_eval_service_comp_metrics/</guid><description>&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2025/06-30_genai_eval_service_overview/"&gt;Gen AI Evaluation Service - An Overview&lt;/a&gt; post,
I introduced Vertex AI’s &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/evaluation-overview"&gt;Gen AI evaluation
service&lt;/a&gt; and talked about the various
classes of metrics it supports. In today’s post, I want to dive into &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/determine-eval#computation-based-metrics"&gt;computation-based
metrics&lt;/a&gt;, what
they provide, and discuss their limitations.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/determine-eval#computation-based-metrics"&gt;Computation-based
metrics&lt;/a&gt; are
metrics that can be calculated using a mathematical formula. They’re deterministic – the same input produces the same
score, unlike model-based metrics where you might get slightly different scores for the same input.&lt;/p&gt;</description></item><item><title>Gen AI Evaluation Service - An Overview</title><link>https://atamel.dev/posts/2025/06-30_genai_eval_service_overview/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/06-30_genai_eval_service_overview/</guid><description>&lt;p&gt;Generating content with Large Language Models (LLMs) is easy. Determining whether the generated content is good is hard.
That’s why evaluating LLM outputs with metrics is crucial. Previously, I talked about
&lt;a href="https://atamel.dev/posts/2024/08-12_deepeval_vertexai/"&gt;DeepEval&lt;/a&gt; and
&lt;a href="https://atamel.dev/posts/2024/11-04_promptfoo_vertexai/"&gt;Promptfoo&lt;/a&gt; as some of the tools you can use for LLM
evaluation. I also talked about &lt;a href="https://javapro.io/2025/05/14/evaluating-rag-pipelines-with-the-rag-triad/"&gt;RAG triad&lt;/a&gt;
metrics specifically for Retrieval Augmented Generation (RAG) evaluation for LLMs.&lt;/p&gt;
&lt;p&gt;In the next few posts, I want to talk about a Google Cloud specific evaluation service: the &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/evaluation-overview?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;Gen AI evaluation
service&lt;/a&gt;
in Vertex AI. The &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/models/evaluation-overview?utm_campaign=CDR_0xe875a906_default&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;Gen AI evaluation
service&lt;/a&gt;
in Vertex AI lets you evaluate any generative model or application against a set of criteria or your own custom
criteria.&lt;/p&gt;</description></item><item><title>Evaluating RAG pipelines with the RAG triad</title><link>https://atamel.dev/posts/2025/05-14_evaluate_rag_with_rag_triad/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/05-14_evaluate_rag_with_rag_triad/</guid><description>&lt;p&gt;Retrieval-Augmented Generation (RAG) emerged as a dominant framework for feeding Large Language Models (LLMs) the
context beyond the scope of their training data and enabling LLMs to respond with more grounded answers and fewer
hallucinations based on that context.&lt;/p&gt;
&lt;p&gt;However, designing an effective RAG pipeline can be challenging. You need to answer questions such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How should you parse and chunk text documents for vector embedding? What chunk size and overlay size should you use?&lt;/li&gt;
&lt;li&gt;What vector embedding model should you use?&lt;/li&gt;
&lt;li&gt;What retrieval method should I use to fetch the relevant context? How many documents should you retrieve by default?
Does the retriever 1.actually manage to retrieve the applicable documents?&lt;/li&gt;
&lt;li&gt;Does the generator actually generate content that is in line with the retrieved context? What parameters (model,
prompt template, temperature) work better?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only way to objectively answer these questions is to measure how well the RAG pipeline works, but what exactly do
you measure, and how do you measure it? This is the topic I’ll cover here.&lt;/p&gt;</description></item><item><title>DeepEval adds native support for Gemini as an LLM Judge</title><link>https://atamel.dev/posts/2025/04-29_deepeval_native_gemini_judge/</link><pubDate>Tue, 29 Apr 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/04-29_deepeval_native_gemini_judge/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/raw/main/samples/evaluation/deepeval/images/deepeval_gemini.png" alt="DeepEval and Gemini" /&gt;
 
 &lt;figcaption&gt;DeepEval and Gemini&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2024/08-12_deepeval_vertexai/"&gt;previous post on DeepEval and Vertex AI&lt;/a&gt;, I introduced
&lt;a href="https://www.deepeval.com/"&gt;DeepEval&lt;/a&gt;, an open-source evaluation framework for LLMs. I also demonstrated how to use
Gemini (on Vertex AI) as an LLM Judge in DeepEval, replacing the default OpenAI judge to evaluate outputs from other
LLMs. At that time, the Gemini integration with DeepEval wasn’t ideal and I had to implement my own integration.&lt;/p&gt;
&lt;p&gt;Thanks to the excellent work by &lt;a href="https://www.linkedin.com/in/arsan/"&gt;Roy Arsan&lt;/a&gt; in &lt;a href="https://github.com/confident-ai/deepeval/pull/1493"&gt;PR
#1493&lt;/a&gt;, DeepEval now includes &lt;strong&gt;native Gemini integration&lt;/strong&gt;. Since
it’s built on the new unified &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/sdks/overview"&gt;Google GenAI SDK&lt;/a&gt;,
DeepEval supports Gemini models running both on Vertex AI and Google AI. Nice!&lt;/p&gt;</description></item><item><title>Much simplified function calling in Gemini 2.X models</title><link>https://atamel.dev/posts/2025/04-08_simplified_function_calling_gemini/</link><pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/04-08_simplified_function_calling_gemini/</guid><description>&lt;p&gt;Last year, in my &lt;a href="https://atamel.dev/posts/2024/08-06_deepdive_function_calling_gemini/"&gt;Deep dive into function calling in Gemini&lt;/a&gt;
post, I talked about how to do function calling in Gemini. More specifically, I showed how to call two functions
(&lt;code&gt;location_to_lat_long&lt;/code&gt; and &lt;code&gt;lat_long_to_weather&lt;/code&gt;) to get the weather information for a location from Gemini.
It wasn&amp;rsquo;t difficult but it involved a lot of steps for 2 simple function calls.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pleased to see that the latest Gemini 2.X models and the unified Google Gen AI SDK (that I talked about in my
&lt;a href="https://atamel.dev/posts/2024/12-17_vertexai_googleai_united_with_new_genai_sdk/"&gt;Gemini on Vertex AI and Google AI now unified with the new Google Gen AI SDK&lt;/a&gt;)
made function calling much simpler.&lt;/p&gt;</description></item><item><title>RAG with a PDF using LlamaIndex and SimpleVectorStore on Vertex AI</title><link>https://atamel.dev/posts/2025/03-24_rag_llamaindex_vertexai/</link><pubDate>Mon, 24 Mar 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/03-24_rag_llamaindex_vertexai/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/llamaindex_vertexai.png" alt="LlamaIndex and Vertex AI" /&gt;
 
 &lt;figcaption&gt;LlamaIndex and Vertex AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Previously, I showed how to do &lt;a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/grounding/rag-pdf-annoy"&gt;RAG with a PDF using LangChain and Annoy Vector
Store&lt;/a&gt; and &lt;a href="https://github.com/meteatamel/genai-beyond-basics/tree/main/samples/grounding/rag-pdf-firestore"&gt;RAG with a PDF
using LangChain and Firestore Vector
Store&lt;/a&gt;. Both used a PDF
as the RAG backend and used LangChain as the LLM framework to orchestrate RAG ingestion and retrieval.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.llamaindex.ai/"&gt;LlamaIndex&lt;/a&gt; is another popular LLM framework. I wondered how to set up the same PDF based
RAG pipeline with LlamaIndex and Vertex AI but I didn’t find a good sample. I put together a sample and in this short
post, I show how to set up the same PDF based RAG pipeline with LlamaIndex.&lt;/p&gt;</description></item><item><title>Ensuring AI Code Quality with SonarQube + Gemini Code Assist</title><link>https://atamel.dev/posts/2025/03-04_ensure_code_quality_sonarqube_gemini/</link><pubDate>Tue, 04 Mar 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/03-04_ensure_code_quality_sonarqube_gemini/</guid><description>&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2025/01-28_code_quality_ai_development/"&gt;Code Quality in the Age of AI-Assisted
Development&lt;/a&gt; blog post, I talked about how generative
AI is changing the way we code and its potential impact on code quality. I recommended using &lt;strong&gt;static code analysis
tools to&lt;/strong&gt; monitor AI-generated code, ensuring its security and quality.&lt;/p&gt;
&lt;p&gt;In this blog post, I will explore one such static code analysis tool,
&lt;a href="https://www.sonarsource.com/products/sonarqube/"&gt;SonarQube&lt;/a&gt;, and see how it improves the quality of AI-generated code.&lt;/p&gt;</description></item><item><title>Code Quality in the Age of AI-Assisted Development</title><link>https://atamel.dev/posts/2025/01-28_code_quality_ai_development/</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/01-28_code_quality_ai_development/</guid><description>&lt;p&gt;As developers transition from manual coding to AI-assisted coding, an increasing share of code is now being generated by
AI. This shift has significantly boosted productivity and efficiency, but it raises an important question: &lt;strong&gt;how does
AI-assisted development impact code quality?&lt;/strong&gt; How can we ensure that AI-generated code maintains high quality, adheres
to good style, and follows best practices? This question has been on my mind recently, and it is the topic of this blog
post.&lt;/p&gt;</description></item><item><title>Improve the RAG pipeline with RAG triad metrics</title><link>https://atamel.dev/posts/2025/01-21_improve-rag-with-rag-triad-metrics/</link><pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/01-21_improve-rag-with-rag-triad-metrics/</guid><description>&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2025/01-14_rag_evaluation_deepeval/"&gt;RAG Evaluation - A Step-by-Step Guide with
DeepEval&lt;/a&gt; post, I showed how to evaluate a RAG pipeline
with the RAG triad metrics using &lt;a href="https://docs.confident-ai.com/"&gt;DeepEval&lt;/a&gt; and Vertex AI. As a recap, these were the
results:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2025/rag_deepeval_results3.png" alt="RAG triad with DeepEval" /&gt;
 
 &lt;figcaption&gt;RAG triad with DeepEval&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer relevancy&lt;/strong&gt; and &lt;strong&gt;faithfulness&lt;/strong&gt; metrics had perfect 1.0 scores whereas &lt;strong&gt;contextual relevancy&lt;/strong&gt; was low at
0.29 because we retrieved a lot of irrelevant context:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="mf"&gt;0.29&lt;/span&gt; &lt;span class="n"&gt;because&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="n"&gt;mentions&lt;/span&gt; &lt;span class="n"&gt;relevant&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;The Cymbal Starlight 2024 has a cargo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="mf"&gt;13.5&lt;/span&gt; &lt;span class="n"&gt;cubic&lt;/span&gt; &lt;span class="n"&gt;feet&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;, much of the retrieved context is irrelevant. For example, several statements discuss&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;towing&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Your Cymbal Starlight 2024 is not equipped to tow a trailer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;load&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;To access the cargo area, open the trunk lid using the trunk release lever located in the driver&amp;#39;s footwell&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;instead&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;focusing&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;requested&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Can we improve this? Let&amp;rsquo;s take a look.&lt;/p&gt;</description></item><item><title>RAG Evaluation - A Step-by-Step Guide with DeepEval</title><link>https://atamel.dev/posts/2025/01-14_rag_evaluation_deepeval/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/01-14_rag_evaluation_deepeval/</guid><description>&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2025/01-09_evaluating_rag_pipelines/"&gt;Evaluating RAG pipelines&lt;/a&gt; post, I introduced two approaches to evaluating RAG pipelines. In this post, I will show you how to implement these two approaches in detail. The implementation will naturally depend on the framework you use. In my case, I’ll be using &lt;a href="https://docs.confident-ai.com/"&gt;DeepEval&lt;/a&gt;, an open-source evaluation framework.&lt;/p&gt;
&lt;h2 id="approach-1-evaluating-retrieval-and-generator-separately"&gt;Approach 1: Evaluating Retrieval and Generator separately&lt;/h2&gt;
&lt;p&gt;As a recap, in this approach, you evaluate the retriever and generator of the RAG pipeline separately with their own separate metrics. This approach allows to pinpoint issues at the retriever and the generator level:&lt;/p&gt;</description></item><item><title>Evaluating RAG pipelines</title><link>https://atamel.dev/posts/2025/01-09_evaluating_rag_pipelines/</link><pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2025/01-09_evaluating_rag_pipelines/</guid><description>&lt;p&gt;Retrieval-Augmented Generation (RAG) emerged as a dominant framework to feed LLMs the context beyond the scope of its
training data and enable LLMs to respond with more grounded answers with less hallucinations based on that context.&lt;/p&gt;
&lt;p&gt;However, designing an effective RAG pipeline can be challenging. You need to answer certain questions such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How should you parse and chunk text documents for embedding? What chunk and overlay size to use?&lt;/li&gt;
&lt;li&gt;What embedding model is best for your use case?&lt;/li&gt;
&lt;li&gt;What retrieval method works most effectively? How many documents should you retrieve by default? Does the retriever
actually manage to retrieve the relevant documents?&lt;/li&gt;
&lt;li&gt;Does the generator actually generate content in line with the relevant context? What parameters (e.g. model, prompt
template, temperature) work better?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only way to objectively answer these questions is to measure how well the RAG pipeline works but what exactly do you
measure? This is the topic of this blog post.&lt;/p&gt;</description></item><item><title>Gemini on Vertex AI and Google AI now unified with the new Google Gen AI SDK</title><link>https://atamel.dev/posts/2024/12-17_vertexai_googleai_united_with_new_genai_sdk/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/12-17_vertexai_googleai_united_with_new_genai_sdk/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been working with Gemini, you&amp;rsquo;ve likely encountered the two separate client libraries for Gemini:
the Gemini library for Google AI vs. Vertex AI in Google Cloud. Even though the two libraries are quite similar, there are
slight differences that make the two libraries non-interchangeable.&lt;/p&gt;
&lt;p&gt;I usually start my experiments in Google AI and when it is time to switch to Vertex AI on Google Cloud, I couldn&amp;rsquo;t
simply copy and paste my code. I had to go through updating my Google AI libraries to Vertex AI libraries. It wasn&amp;rsquo;t difficult
but it was quite annoying.&lt;/p&gt;</description></item><item><title>Control LLM output with LangChain's structured and Pydantic output parsers</title><link>https://atamel.dev/posts/2024/12-09_control_llm_output_langchain_structured_pydantic/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/12-09_control_llm_output_langchain_structured_pydantic/</guid><description>&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2024/07-15_control_llm_output/"&gt;Control LLM output with response type and schema&lt;/a&gt;
post, I talked about how you can define a JSON response schema and Vertex AI makes sure the output of the
Large Language Model (LLM) conforms to that schema.&lt;/p&gt;
&lt;p&gt;In this post, I show how you can implement a similar response schema using LangChain&amp;rsquo;s structured output parser
with any model. You can further get the output parsed and populated into Python classes automatically with the
Pydantic output parser. This helps you to really narrow down and structure LLM outputs.&lt;/p&gt;</description></item><item><title>Tracing with Langtrace and Gemini</title><link>https://atamel.dev/posts/2024/11-27_tracing_langtrace_gemini/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/11-27_tracing_langtrace_gemini/</guid><description>&lt;p&gt;Large Language Models (LLMs) feel like a totally new technology with totally new problems. It&amp;rsquo;s true to some extent but
at the same time, they also have the same old problems that we had to tackle in traditional technology.&lt;/p&gt;
&lt;p&gt;For example, how do you figure out which LLM calls are taking too long or have failed? At the bare minimum, you need logging
but ideally, you use a full observability platform like &lt;a href="https://opentelemetry.io/"&gt;OpenTelemetry&lt;/a&gt; with logging,
tracing, metrics and more. You need the good old software engineering practices, such as observability, applied to new
technologies like LLMs.&lt;/p&gt;</description></item><item><title>Batch prediction in Gemini</title><link>https://atamel.dev/posts/2024/11-18_batch_prediction_gemini/</link><pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/11-18_batch_prediction_gemini/</guid><description>&lt;p&gt;LLMs are great in generating content on demand but if left unchecked, you can be left with a large bill at the end of
the day. In my &lt;a href="https://atamel.dev/posts/2024/07-19_control_llm_costs_context_caching/"&gt;Control LLM costs with context
caching&lt;/a&gt; post, I talked about how to limit costs
by using context caching. Batch generation is another technique you can use to save time at a discounted price.&lt;/p&gt;
&lt;h2 id="whats-batch-generation"&gt;What&amp;rsquo;s batch generation?&lt;/h2&gt;
&lt;p&gt;Batch generation in Gemini allows you to send multiple generative AI requests in batches rather than one by one and get
responses asynchronously either in a Cloud Storage bucket or a BigQuery table. This not only simplifies processing of
large datasets, but it also saves time and money, as batch requests are processed in paralllel and discounted 50% from
standard requests.&lt;/p&gt;</description></item><item><title>LLM Guard and Vertex AI</title><link>https://atamel.dev/posts/2024/11-11_llmguard_vertexai/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/11-11_llmguard_vertexai/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/guardrails/llmguard/images/llm_guard.png?raw=true" alt="LLM Guard and Vertex AI" /&gt;
 
 &lt;figcaption&gt;LLM Guard and Vertex AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been focusing on evaluation frameworks lately because I believe that the hardest problem while using LLMs is to
make sure they behave properly. Are you getting the right outputs grounded with your data? Are outputs free of
harmful or PII data? When you make a change to your RAG pipeline or to your prompts, are outputs getting better or worse?
How do you know? You don&amp;rsquo;t know unless you measure. What do you measure and how? These are the sort of questions you need
to answer and that&amp;rsquo;s when evaluation frameworks come into the picture.&lt;/p&gt;</description></item><item><title>Promptfoo and Vertex AI</title><link>https://atamel.dev/posts/2024/11-04_promptfoo_vertexai/</link><pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/11-04_promptfoo_vertexai/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/evaluation/promptfoo/images/promptfoo_vertexai.png?raw=true" alt="Promptfoo and Vertex AI" /&gt;
 
 &lt;figcaption&gt;Promptfoo and Vertex AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2024/08-12_deepeval_vertexai/"&gt;DeepEval and Vertex AI&lt;/a&gt; blog post, I talked about how crucial it is to have an evaluation framework
in place when working with Large Language Models (LLMs) and introduced &lt;a href="https://docs.confident-ai.com/"&gt;DeepEval&lt;/a&gt; as
one of such evaluation frameworks.&lt;/p&gt;
&lt;p&gt;Recently, I came across another LLM evaluation and security framework called &lt;a href="https://www.promptfoo.dev/"&gt;Promptfoo&lt;/a&gt;.
In this post, I will introduce &lt;a href="https://www.promptfoo.dev/"&gt;Promptfoo&lt;/a&gt;, show what it provides for evaluations and
security testing, and how it can be used with Vertex AI.&lt;/p&gt;</description></item><item><title>Firestore for Image Embeddings</title><link>https://atamel.dev/posts/2024/10-29_firestore_for_image_embeddings/</link><pubDate>Tue, 29 Oct 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/10-29_firestore_for_image_embeddings/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/firestore_langchain.png" alt="Firestore and LangChain" /&gt;
 
 &lt;figcaption&gt;Firestore and LangChain&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my previous &lt;a href="https://medium.com/firebase-developers/firestore-for-text-embedding-and-similarity-search-d74acbc8d6f5"&gt;Firestore for Text Embedding and Similarity Search&lt;/a&gt; post, I talked about how Firestore and LangChain can help you to store &lt;strong&gt;text embeddings&lt;/strong&gt; and do similarity searches against them. With &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-multimodal-embeddings"&gt;multimodal&lt;/a&gt; embedding models, you can generate embeddings not only for text but for images and video as well. In this post, I will show you how to store &lt;strong&gt;image embeddings&lt;/strong&gt; in Firestore and later use them for similarity search.&lt;/p&gt;</description></item><item><title>Firestore for Text Embedding and Similarity Search</title><link>https://atamel.dev/posts/2024/10-09_firestore_text_embedding_search/</link><pubDate>Wed, 09 Oct 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/10-09_firestore_text_embedding_search/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/firestore_langchain.png" alt="Firestore and LangChain" /&gt;
 
 &lt;figcaption&gt;Firestore and LangChain&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In my previous &lt;a href="https://medium.com/firebase-developers/persisting-llm-chat-history-to-firestore-4e3716dd67fe"&gt;Persisting LLM chat history to
Firestore&lt;/a&gt;
post, I showed how to persist chat messages in Firestore for more meaningful and
context-aware conversations. Another common requirement in LLM applications is
to ground responses in data for more relevant answers. For that, you need
&lt;strong&gt;embeddings&lt;/strong&gt;. In this post, I want to talk specifically about &lt;strong&gt;text
embeddings&lt;/strong&gt; and how Firestore and LangChain can help you to store text
embeddings and do similarity searches against them.&lt;/p&gt;</description></item><item><title>Persisting LLM chat history to Firestore</title><link>https://atamel.dev/posts/2024/10-01_persist_llm_chat_history_firestore/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/10-01_persist_llm_chat_history_firestore/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/firestore_langchain.png" alt="Firestore and LangChain" /&gt;
 
 &lt;figcaption&gt;Firestore and LangChain&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://firebase.google.com/docs/firestore"&gt;Firestore&lt;/a&gt; has long been my go-to
NoSQL backend for my serverless apps. Recently, it’s becoming my go-to backend
for my LLM powered apps too. In this series of posts, I want to show you how
Firestore can help for your LLM apps.&lt;/p&gt;
&lt;p&gt;In the first post of the series, I want to talk about LLM powered chat
applications. I know, not all LLM apps have to be chat based apps but a lot of
them are because LLMs are simply very good at chat based communication.&lt;/p&gt;</description></item><item><title>Semantic Kernel and Gemini</title><link>https://atamel.dev/posts/2024/08-19_semantic_kernel_gemini/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/08-19_semantic_kernel_gemini/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/blob/main/samples/frameworks/semantic-kernel/chat/images/semantic_kernel_gemini.png?raw=true" alt="Semantic Kernel and VertexAI" /&gt;
 
 &lt;figcaption&gt;Semantic Kernel and VertexAI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re building a Large Language Model (LLMs) application, you typically
start with the SDK of the LLM you&amp;rsquo;re trying to talk to. However, at some point,
it might make sense to start using a higher level framework. This is especially
true if you rely on multiple LLMs from different vendors. Instead of learning
and using SDKs from multiple vendors, you can learn a higher level framework and
use that to orchestrate your calls to multiple LLMs. These frameworks also
have useful abstractions beyond simple LLM calls that accelerate LLM application
development.&lt;/p&gt;</description></item><item><title>DeepEval and Vertex AI</title><link>https://atamel.dev/posts/2024/08-12_deepeval_vertexai/</link><pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/08-12_deepeval_vertexai/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/raw/main/samples/evaluation/deepeval/images/deepeval_vertexai.png" alt="DeepEval and VertexAI" /&gt;
 
 &lt;figcaption&gt;DeepEval and VertexAI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re working with Large Language Models (LLMs), it&amp;rsquo;s crucial to have an
evaluation framework in place. Only by constantly evaluating and testing your
LLM outputs, you can tell if the changes you&amp;rsquo;re making to prompts or the output
you&amp;rsquo;re getting back from the LLM are actually good.&lt;/p&gt;
&lt;p&gt;In this blog post, we&amp;rsquo;ll look into one of those evaluation frameworks called
&lt;a href="https://docs.confident-ai.com/"&gt;DeepEval&lt;/a&gt;, an open-source evaluation
framework for LLMs. It allows to &amp;ldquo;unit test&amp;rdquo; LLM outputs in a similar way to
Pytest. We&amp;rsquo;ll also see how DeepEval can be configured to work with Vertex AI.&lt;/p&gt;</description></item><item><title>Deep dive into function calling in Gemini</title><link>https://atamel.dev/posts/2024/08-06_deepdive_function_calling_gemini/</link><pubDate>Tue, 06 Aug 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/08-06_deepdive_function_calling_gemini/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this blog post, we&amp;rsquo;ll deep dive into function calling in Gemini. More
specifically, you&amp;rsquo;ll see how to handle &lt;strong&gt;multiple&lt;/strong&gt; and &lt;strong&gt;parallel&lt;/strong&gt; function
call requests from &lt;code&gt;generate_content&lt;/code&gt; and &lt;code&gt;chat&lt;/code&gt; interfaces and take a look at
the new &lt;strong&gt;auto function calling&lt;/strong&gt; feature through a sample weather application.&lt;/p&gt;
&lt;h2 id="what-is-function-calling"&gt;What is function calling?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling"&gt;Function
Calling&lt;/a&gt;
is useful to augment LLMs with more up-to-date data via external API calls.&lt;/p&gt;
&lt;p&gt;You can define custom functions and provide these to an LLM. While processing a
prompt, the LLM can choose to delegate tasks to the functions that you identify.
The model does not call the functions directly but rather makes function call
requests with parameters to your application. In turn, your application code
responds to function call requests by calling external APIs and providing the
responses back to the model, allowing the LLM to complete its response to the prompt.&lt;/p&gt;</description></item><item><title>Control LLM costs with context caching</title><link>https://atamel.dev/posts/2024/07-19_control_llm_costs_context_caching/</link><pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/07-19_control_llm_costs_context_caching/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://github.com/meteatamel/genai-beyond-basics/raw/main/samples/context-caching/images/context-caching.png" alt="Context caching" /&gt;
 
 &lt;figcaption&gt;Context caching&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Some large language models (LLMs), such as Gemini 1.5 Flash or Gemini 1.5 Pro, have a very large context
window. This is very useful if you want to analyze a big chunk of data, such as
a whole book or a long video. On the other hand, it can get quite expensive if
you keep sending the same large data in your prompts. Context caching can help.&lt;/p&gt;</description></item><item><title>Control LLM output with response type and schema</title><link>https://atamel.dev/posts/2024/07-15_control_llm_output/</link><pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/07-15_control_llm_output/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Large language models (LLMs) are great at generating content but the output
format you get back can be a hit or miss sometimes.&lt;/p&gt;
&lt;p&gt;For example, you ask for a JSON output in certain format and you might get
free-form text or a JSON wrapped in markdown string or a proper JSON but with
some required fields missing. If your application requires a strict format, this
can be a real problem.&lt;/p&gt;</description></item><item><title>RAG API powered by LlamaIndex on Vertex AI</title><link>https://atamel.dev/posts/2024/07-08_ragapi_llamaindex_vertexai/</link><pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/07-08_ragapi_llamaindex_vertexai/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/llamaindex_vertexai.png" alt="LlamaIndex and Vertex AI" /&gt;
 
 &lt;figcaption&gt;LlamaIndex and Vertex AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Recently, I talked about why grounding LLMs is important and how to ground LLMs
with public data using Google Search (&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/using-vertex-ai-grounding-with-google-search"&gt;Vertex AI&amp;rsquo;s Grounding with Google Search:
how to use it and
why&lt;/a&gt;)
and with private data using Vertex AI Search (&lt;a href="https://atamel.dev/posts/2024/07-01_grounding_with_own_data_vertexai_search/"&gt;Grounding LLMs with your own data using Vertex AI Search&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In today’s post, I want to talk about another more flexible and customizable way
of grounding your LLMs with private data: &lt;strong&gt;the RAG API powered by LlamaIndex on
Vertex AI&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Grounding LLMs with your own data using Vertex AI Search</title><link>https://atamel.dev/posts/2024/07-01_grounding_with_own_data_vertexai_search/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/07-01_grounding_with_own_data_vertexai_search/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In my previous &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/using-vertex-ai-grounding-with-google-search"&gt;Vertex AI&amp;rsquo;s Grounding with Google Search: how to use it and why&lt;/a&gt; post, I explained why you need grounding with large language models (LLMs) and how Vertex AI’s grounding with Google Search can help to ground LLMs with public up-to-date data.&lt;/p&gt;
&lt;p&gt;That’s great but you sometimes need to ground LLMs with your own private data. How can you do that? There are many ways but Vertex AI Search is the easiest way and that’s what I want to talk about today with a simple use case.&lt;/p&gt;</description></item><item><title>Give your LLM a quick lie detector test</title><link>https://atamel.dev/posts/2024/06-06_llm_lie_detector_test/</link><pubDate>Thu, 06 Jun 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/06-06_llm_lie_detector_test/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/lie_detector_llm.png" alt="Lie Detector LLM" /&gt;
 
 &lt;figcaption&gt;Lie Detector LLM&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;It’s no secret that LLMs sometimes lie and they do so in a very confident kind of way. This might be OK for some applications but it can be a real problem if your application requires high levels of accuracy.&lt;/p&gt;
&lt;p&gt;I remember when the first LLMs emerged back in early 2023. I tried some of the early models and it felt like they were hallucinating half of the time. More recently, it started feeling like LLMs are getting better at giving more factual answers. But it’s just a feeling and you can’t base application decisions (or any decision?) on feelings, can you?&lt;/p&gt;</description></item><item><title>Vertex AI's Grounding with Google Search - how to use it and why</title><link>https://atamel.dev/posts/2024/05-29_using-vertex-ai-grounding-with-google-search/</link><pubDate>Wed, 29 May 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/05-29_using-vertex-ai-grounding-with-google-search/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Once in a while, you come across a feature that is so easy to use and so useful
that you don’t know how you lived without it before. For me, Vertex AI&amp;rsquo;s &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/overview#ground-public"&gt;Grounding
with Google
Search&lt;/a&gt;
is one of those features.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/using-vertex-ai-grounding-with-google-search?e=48754805"&gt;this blog
post&lt;/a&gt;,
I explain why you need grounding with large language models (LLMs) and how
Vertex AI’s Grounding with Google Search can help with minimal effort on your
part.&lt;/p&gt;</description></item><item><title>A tour of Gemini 1.5 Pro samples</title><link>https://atamel.dev/posts/2024/05-07_gemini_15_pro_samples/</link><pubDate>Tue, 07 May 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/05-07_gemini_15_pro_samples/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Back in February, Google
&lt;a href="https://blog.google/technology/ai/google-gemini-next-generation-model-february-2024"&gt;announced&lt;/a&gt;
Gemini 1.5 Pro with its impressive 1 million token context window.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/gemini15.gif" alt="Gemini 1.5 Pro" title="Gemini 1.5 Pro" /&gt;
 
 &lt;figcaption&gt;Gemini 1.5 Pro&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Larger context size means that Gemini 1.5 Pro can process vast amounts of
information in one go — 1 hour of video, 11 hours of audio, 30,000 lines of code
or over 700,000 words and the good news is that there&amp;rsquo;s good language support.&lt;/p&gt;
&lt;p&gt;In this blog post, I will point out some samples utilizing Gemini 1.5 Pro in
Google Cloud&amp;rsquo;s Vertex AI in different use cases and languages (Python, Node.js,
Java, C#, Go).&lt;/p&gt;</description></item><item><title>C# and Vertex AI Gemini streaming API bug and workaround</title><link>https://atamel.dev/posts/2024/05-01_csharp_vertex_gemini_streaming_bug/</link><pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/05-01_csharp_vertex_gemini_streaming_bug/</guid><description>&lt;p&gt;A user recently
&lt;a href="https://github.com/GoogleCloudPlatform/dotnet-docs-samples/issues/2609"&gt;reported&lt;/a&gt;
an intermittent error with C# and Gemini 1.5 model on Vertex AI&amp;rsquo;s streaming API.
In this blog post, I want to outline what the error is, what causes it, and how
to avoid it with the hopes of saving some frustration for someone out there.&lt;/p&gt;
&lt;h2 id="error"&gt;Error&lt;/h2&gt;
&lt;p&gt;The user reported using &lt;code&gt;Google.Cloud.AIPlatform.V1&lt;/code&gt; library with version
&lt;code&gt;2.27.0&lt;/code&gt; to use Gemini &lt;code&gt;1.5&lt;/code&gt; via Vertex AI&amp;rsquo;s streaming API and running into an
intermittent &lt;code&gt;System.IO.IOException&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>A Tour of Gemini Code Assist - Slides and Demos</title><link>https://atamel.dev/posts/2024/04_24_tour_of_gemini_code_assist/</link><pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/04_24_tour_of_gemini_code_assist/</guid><description>&lt;p&gt;This week, I&amp;rsquo;m speaking at 3 meetups on &lt;a href="https://cloud.google.com/products/gemini/code-assist"&gt;Gemini Code
Assist&lt;/a&gt;. My talk has a
little introduction to GenAI and Gemini, followed by a series of hands-on demos
that showcase different features of Gemini Code Assist.&lt;/p&gt;
&lt;p&gt;In the demos, I setup Gemini Code Assist in &lt;a href="https://cloud.google.com/code"&gt;Cloud
Code&lt;/a&gt; IDE plugin in Visual Studio Code. Then, I
show how to design and create an application, explain, run, generate, test,
transform code, and finish with understanding logs with the help of Gemini.&lt;/p&gt;</description></item><item><title>Vertex AI Gemini generateContent (non-streaming) API</title><link>https://atamel.dev/posts/2024/02-26_vertexai_gemini_generate_content_api/</link><pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/02-26_vertexai_gemini_generate_content_api/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In my recent blog post, I&amp;rsquo;ve been exploring Vertex AI&amp;rsquo;s Gemini REST API and mainly talked
about the
&lt;a href="https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.publishers.models/streamGenerateContent"&gt;&lt;code&gt;streamGenerateContent&lt;/code&gt;&lt;/a&gt;
method which is a streaming API.&lt;/p&gt;
&lt;p&gt;Recently, a new method appeared in Vertex AI docs:
&lt;a href="https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.publishers.models/generateContent"&gt;&lt;code&gt;generateContent&lt;/code&gt;&lt;/a&gt;
which is the &lt;strong&gt;non-streaming&lt;/strong&gt; (unary) version of the API.&lt;/p&gt;
&lt;p&gt;In this short blog post, I take a closer look at the new non-streaming
&lt;code&gt;generateContent&lt;/code&gt; API and explain why it makes sense to use as a simpler API when
the latency is not super critical.&lt;/p&gt;</description></item><item><title>Using Vertex AI Gemini from GAPIC libraries (C#)</title><link>https://atamel.dev/posts/2024/02-14_vertexai_gemini_gapic_libraries/</link><pubDate>Wed, 14 Feb 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/02-14_vertexai_gemini_gapic_libraries/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/gemini.png" alt="Gemini" title="Gemini" /&gt;
 
 &lt;figcaption&gt;Gemini&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In my previous &lt;a href="https://atamel.dev/posts/2024/02-05_vertexai_gemini_restapi_csharp_rust/"&gt;Using Vertex AI Gemini REST API&lt;/a&gt;
post, I showed how to use the Gemini REST API from languages without SDK support
yet such as C# and Rust.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s actually another way to use Gemini from languages without SDK support:
&lt;strong&gt;GAPIC libraries&lt;/strong&gt;. In this post, I show you how to use Vertex AI Gemini from
GAPIC libraries, using C# as an example.&lt;/p&gt;
&lt;h2 id="what-is-gapic"&gt;What is GAPIC?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;At this point, you might be wondering: What&amp;rsquo;s GAPIC?&lt;/strong&gt; GAPIC stands for Google API
CodeGen. In Google Cloud, all services have auto-generated libraries from
Google&amp;rsquo;s service proto files. Since these libraries are auto-generated, they&amp;rsquo;re
not the easiest and most intuitive way of calling a service. Because of that,
some services also have hand-written SDKs/libraries on top of GAPIC libraries.&lt;/p&gt;</description></item><item><title>Using Vertex AI Gemini REST API (C# and Rust)</title><link>https://atamel.dev/posts/2024/02-05_vertexai_gemini_restapi_csharp_rust/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/02-05_vertexai_gemini_restapi_csharp_rust/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Back in December, Google announced
&lt;a href="https://blog.google/technology/ai/google-gemini-ai/"&gt;Gemini&lt;/a&gt;, its most capable
and general model so far available from &lt;a href="https://makersuite.google.com/"&gt;Google AI
Studio&lt;/a&gt; and&lt;a href="https://cloud.google.com/vertex-ai/docs/generative-ai/start/quickstarts/quickstart-multimodal"&gt; Google Cloud Vertex
AI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/gemini.png" alt="Gemini" title="Gemini" /&gt;
 
 &lt;figcaption&gt;Gemini&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://cloud.google.com/vertex-ai/docs/generative-ai/start/quickstarts/quickstart-multimodal"&gt;Try the Vertex AI Gemini
API&lt;/a&gt;
documentation page shows instructions on how to use the Gemini API from
&lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, &lt;strong&gt;Java&lt;/strong&gt;, and &lt;strong&gt;Go&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/try_vertexai_page.png" alt="alt_text" title="Try the Vertex AI Gemini API" /&gt;
 
 &lt;figcaption&gt;alt_text&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That’s great but what about other languages?&lt;/p&gt;
&lt;p&gt;Even though there are no official SDKs/libraries for other languages yet, you
can use the &lt;a href="https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini"&gt;Gemini REST
API&lt;/a&gt;
to access the same functionality with a little bit more work on your part.&lt;/p&gt;</description></item><item><title>Test and change an existing web app with Duet AI</title><link>https://atamel.dev/posts/2024/01-29_duetai_test_change_existing_webapp/</link><pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/01-29_duetai_test_change_existing_webapp/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/duetai_logo.png" alt="Duet AI" /&gt;
 
 &lt;figcaption&gt;Duet AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://atamel.dev/posts/2024/01-23_duetai_create_deploy_webapp_clourun/"&gt;Create and deploy a new web app to Cloud Run with Duet AI&lt;/a&gt; post,
I created a simple web application and deployed to Cloud Run using &lt;a href="https://cloud.google.com/duet-ai"&gt;Duet
AI&lt;/a&gt;&amp;rsquo;s help. Duet AI has been great to get a new
and simple app up and running. But does it help for existing apps? Let&amp;rsquo;s figure
it out.&lt;/p&gt;
&lt;p&gt;In this blog post, I take an existing web app, explore it,
test it, add a unit test, add new functionality, and add more unit tests all
with the help of Duet AI. Again, I captured some lessons learned along the way to
get the most out of Duet AI.&lt;/p&gt;</description></item><item><title>Create and deploy a new web app to Cloud Run with Duet AI</title><link>https://atamel.dev/posts/2024/01-23_duetai_create_deploy_webapp_clourun/</link><pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/01-23_duetai_create_deploy_webapp_clourun/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2024/duetai_logo.png" alt="Duet AI" /&gt;
 
 &lt;figcaption&gt;Duet AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I’ve been playing with &lt;a href="https://cloud.google.com/duet-ai"&gt;Duet AI&lt;/a&gt;, Google’s
AI-powered collaborator, recently to see how useful it can be for my development
workflow. I&amp;rsquo;m pleasantly surprised how helpful Duet AI can be when provided with
specific questions with the right context.&lt;/p&gt;
&lt;p&gt;In this blog post, I document my journey of creating and deploying a new web
application to Cloud Run with Duet AI&amp;rsquo;s help. I also capture some lessons learned
along the way to get the most out of Duet AI.&lt;/p&gt;</description></item><item><title>C# library and samples for GenAI in Vertex AI</title><link>https://atamel.dev/posts/2023/12-11_csharp_library_and_samples_genai_vertexai/</link><pubDate>Mon, 11 Dec 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/12-11_csharp_library_and_samples_genai_vertexai/</guid><description>&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2023/11-28_multilanguage_libs_samples_genai_vertexai/"&gt;previous
post&lt;/a&gt;,
I talked about multi-language libraries and samples for GenAI. In this post, I
want to zoom into some C# specific information for GenAI in Vertex AI.&lt;/p&gt;
&lt;h2 id="c-genai-samples-for-vertex-ai"&gt;C# GenAI samples for Vertex AI&lt;/h2&gt;
&lt;p&gt;If you want to skip this blog post and just jump into code, there’s a collection
of &lt;a href="https://cloud.google.com/vertex-ai/docs/samples?language=csharp&amp;amp;text=generative"&gt;C# GenAI samples for Vertex
AI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/genai_csharp_samples_vertexai.png" alt="C# GenAI samples for Vertex AI" /&gt;
 
 &lt;figcaption&gt;C# GenAI samples for Vertex AI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Multi-language libraries and samples for GenAI in Vertex AI</title><link>https://atamel.dev/posts/2023/11-28_multilanguage_libs_samples_genai_vertexai/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/11-28_multilanguage_libs_samples_genai_vertexai/</guid><description>&lt;p&gt;You might think that you need to know Python to be able to use GenAI with
VertexAI. While Python is the dominant language in GenAI (and Vertex AI is no
exception in that regard), you can actually use GenAI in Vertex AI from other
languages such as Java, C#, Node.js, Go, and more.&lt;/p&gt;
&lt;p&gt;Let’s take a look at the details.&lt;/p&gt;
&lt;h2 id="vertex-ai-sdk-for-python"&gt;Vertex AI SDK for Python&lt;/h2&gt;
&lt;p&gt;The official SDK for Vertex AI is &lt;a href="https://cloud.google.com/vertex-ai/docs/python-sdk/use-vertex-ai-python-sdk"&gt;Vertex AI SDK for
Python&lt;/a&gt;
and as expected, it’s in Python. You can initialize Vertex AI SDK with some
parameters and utilize GenAI models with a few lines of code:&lt;/p&gt;</description></item><item><title>Generative AI Short Courses by DeepLearning.AI</title><link>https://atamel.dev/posts/2023/07-04_genai_short_courses_by_deeplearning/</link><pubDate>Tue, 04 Jul 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/07-04_genai_short_courses_by_deeplearning/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In my previous couple posts
(&lt;a href="https://medium.com/google-cloud/generative-ai-learning-path-notes-part-1-d36bc565df1f"&gt;post1&lt;/a&gt;,
&lt;a href="https://medium.com/google-cloud/generative-ai-learning-path-notes-part-2-78a1855f6bd0"&gt;post2&lt;/a&gt;),
I shared my detailed notes on &lt;a href="https://www.cloudskillsboost.google/journeys/118"&gt;Generative AI Learning
Path&lt;/a&gt; in Google Cloud’s Skills
Boost. It’s a great collection of courses to get started in GenAI, especially on
the theory underpinning GenAI.&lt;/p&gt;
&lt;p&gt;Since then, I discovered another great resource
to learn more about GenAI: &lt;a href="https://www.deeplearning.ai/short-courses/"&gt;Learn Generative AI Short
Courses&lt;/a&gt; by
&lt;a href="DeepLearning.AI"&gt;DeepLearning.AI&lt;/a&gt; from &lt;a href="https://www.andrewng.org/"&gt;Andrew Ng&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post, I summarize what each course teaches you to help you decide which
course to take. I highly recommend taking all 4 courses. They’re full of useful
information and short enough that even if you’re not fully interested in the
topic, you can still get a good idea about it in a short amount of time.&lt;/p&gt;</description></item><item><title>Generative AI Learning Path Notes – Part 2</title><link>https://atamel.dev/posts/2023/06-15_genai_learningpath_notes_part2/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/06-15_genai_learningpath_notes_part2/</guid><description>&lt;p&gt;If you’re looking to upskill in Generative AI, there’s a &lt;a href="https://www.cloudskillsboost.google/journeys/118"&gt;Generative AI Learning
Path&lt;/a&gt; in Google Cloud Skills
Boost. It currently consists of 10 courses and provides a good foundation on the
theory behind Generative AI.&lt;/p&gt;
&lt;p&gt;As I went through these courses myself, I took notes, as I learn best when I
write things down. In &lt;a href="https://atamel.dev/posts/2023/06-06_genai_learningpath_notes_part1/"&gt;part 1 of the blog
series&lt;/a&gt;, I
shared my notes for courses 1 to 6. In this part 2 of the blog series, I
continue sharing my notes for courses 7 to 10.&lt;/p&gt;</description></item><item><title>Generative AI Learning Path Notes – Part 1</title><link>https://atamel.dev/posts/2023/06-06_genai_learningpath_notes_part1/</link><pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/06-06_genai_learningpath_notes_part1/</guid><description>&lt;p&gt;If you’re looking to upskill in Generative AI (GenAI), there’s a &lt;a href="https://www.cloudskillsboost.google/journeys/118"&gt;Generative AI
Learning Path&lt;/a&gt; in Google Cloud
Skills Boost. It currently consists of 10 courses and provides a good foundation
on the theory behind Generative AI and what tools and services Google provides in
GenAI. The best part is that it’s completely free!&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/genai_learningpath_part1.png" alt="GenAI Learning Path" /&gt;
 
 &lt;figcaption&gt;GenAI Learning Path&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As I went through these courses myself, I took notes, as I learn best when I
write things down. In this part 1 of the blog series, I want to share my notes
for courses 1 to 6, in case you want to quickly read summaries of these courses.&lt;/p&gt;</description></item></channel></rss>