<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GoogleAI on Atamel.Dev</title><link>https://atamel.dev/tags/googleai/</link><description>Recent content in GoogleAI 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>Thu, 07 Aug 2025 09:37:39 +0300</lastBuildDate><atom:link href="https://atamel.dev/tags/googleai/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>