

{"id":205283,"date":"2025-12-09T10:15:18","date_gmt":"2025-12-09T13:15:18","guid":{"rendered":"https:\/\/goias.gov.br\/ligo\/?p=205283"},"modified":"2025-12-17T11:01:29","modified_gmt":"2025-12-17T14:01:29","slug":"evoluindo-a-arquitetura-de-modelos-com-langchain","status":"publish","type":"post","link":"https:\/\/goias.gov.br\/ligo\/evoluindo-a-arquitetura-de-modelos-com-langchain\/","title":{"rendered":"Evoluindo a Arquitetura de Modelos com LangChain"},"content":{"rendered":"\n<p><mark style=\"background-color: #ffffff;\"><strong>Comparando a Vers\u00e3o da Classe <em>Ollama<\/em> e a Abordagem <em>ChatOllama<\/em><\/strong><\/mark><em><mark style=\"background-color: #ffffff;\"><strong><br \/><\/strong><\/mark><\/em><\/p>\n<p><\/p>\n<p>Quando trabalhamos com m\u00faltiplos provedores de modelos (como Ollama, Gemini, OpenAI e Azure), \u00e9 recomend\u00e1vel manter um padr\u00e3o nas tipagens e um comportamento uniforme nos projetos. Principalmente naqueles que envolvem RAG, pipelines de avalia\u00e7\u00e3o ou conversas multi-turno, qualquer inconsist\u00eancia no contrato dos modelos rapidamente se torna um gargalo t\u00e9cnico.\u00a0 Nos \u00faltimos meses, o ecossistema LangChain tem passado por mudan\u00e7as significativas, tanto na nomenclatura quanto na arquitetura interna dos seus conectores com modelos de linguagem. Um exemplo claro disso pode ser observado na migra\u00e7\u00e3o do uso da classe <em>Ollama do LangChain <\/em>para <em>ChatOllama <\/em>em aplica\u00e7\u00f5es que integram modelos locais. Al\u00e9m disso, h\u00e1 uma nova \u00eanfase na extra\u00e7\u00e3o de metadados de uso, como contagem de tokens, o que traz benef\u00edcios tanto operacionais quanto de controle de custos. O objetivo deste artigo \u00e9 apresentar os principais pontos de mudan\u00e7a nessa nova abordagem.<\/p>\n<p><\/p>\n<h4><em>Nota: Neste texto, o termo provedor (ou provider) \u00e9 usado no sentido comum da engenharia de IA, ou seja, refere-se \u00e0 plataforma ou servi\u00e7o que hospeda e disponibiliza um modelo de linguagem (como OpenAI, Google, Azure ou Ollama).<\/em><\/h4>\n<p><\/p>\n<h2 class=\"wp-block-heading\">A implementa\u00e7\u00e3o da classe <em>Ollama<\/em><\/h2>\n<p><\/p>\n<p>A importa\u00e7\u00e3o do LangChain com o <strong><em>Ollama <\/em><\/strong>\u00e9 feito como:<\/p>\n<p><\/p>\n<p><code><em>import { Ollama } from \"@langchain\/ollama\";<\/em><\/code><\/p>\n<p><\/p>\n<p>No entanto, essa classe gen\u00e9rica <em>Ollama <\/em>n\u00e3o estava alinhada com a interface de chat utilizada por outros provedores como OpenAI e Gemini. Isso criava inconsist\u00eancias na forma como as mensagens eram formatadas e processadas, especialmente ao usar <em>invoke<\/em>, stream ou outros m\u00e9todos do <em>BaseChatModel<\/em>.\u00a0 Al\u00e9m disso, n\u00e3o havia suporte expl\u00edcito para metadados de uso, o que dificultava o monitoramento de consumo de tokens em ambientes h\u00edbridos (ex: Ollama local + OpenAI em produ\u00e7\u00e3o).<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">A implementa\u00e7\u00e3o Vers\u00e3o <em>ChatOllama<\/em><\/h2>\n<p><\/p>\n<p>A importa\u00e7\u00e3o do LangChain com o <strong><em>ChatOllama <\/em><\/strong>\u00e9 feito como:<\/p>\n<p><\/p>\n<p><code><em>import { ChatOllama } from \"@langchain\/ollama\";<\/em><\/code><\/p>\n<p><\/p>\n<p>Com a atualiza\u00e7\u00e3o temos consist\u00eancia de interface: Agora, todos os provedores (ChatOllama, ChatGoogleGenerativeAI, ChatOpenAI, etc.) herdam de <em>BaseChatModel<\/em>. Isso garante que m\u00e9todos como <em>invoke<\/em>, <em>stream <\/em>e <em>batch <\/em>funcionem da mesma forma, independentemente do provedor.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Tamb\u00e9m temos compatibilidade com sistemas de mem\u00f3ria e agentes: Muitos componentes do LangChain (como ConversationalRetrievalChain, AgentExecutor) esperam um <em>BaseChatModel<\/em>. Usar <em>ChatOllama <\/em>torna a integra\u00e7\u00e3o mais fluida.\u00a0 Outrossim \u00e9 o suporte a mensagens estruturadas: A nova classe trabalha com objetos do tipo <em>BaseMessage<\/em>, permitindo manipula\u00e7\u00e3o granular de <em>HumanMessage, AIMessage, SystemMessag<\/em>e&#8230;<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">A migra\u00e7\u00e3o<\/h2>\n<p><\/p>\n<p>Ao optar pela migra\u00e7\u00e3o dos projetos para a vers\u00e3o <em>ChatOllama<\/em>, temos a vantagem de trabalhar com mensagens estruturadas, nas quais o c\u00f3digo fica mais limpo, leg\u00edvel e mais alinhado \u00e0 forma como os modelos foram treinados. Al\u00e9m disso, com a formata\u00e7\u00e3o autom\u00e1tica do prompt evitamos o desperd\u00edcio de tokens em compara\u00e7\u00e3o com a formata\u00e7\u00e3o manual.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">Considera\u00e7\u00f5es finais<\/h2>\n<p><\/p>\n<p>Na pr\u00e1tica da ci\u00eancia de dados aplicada a LLMs, a capacidade de isolar vari\u00e1veis, modelo,\u00a0 prompt ou contexto depende diretamente da estabilidade da interface de infer\u00eancia. A utiliza\u00e7\u00e3o da classe <em>Ollama do LangChain <\/em>como inst\u00e2ncia de LLM (baseada em strings brutas) introduzia um vi\u00e9s sistem\u00e1tico: a formata\u00e7\u00e3o do prompt ficava sob responsabilidade do c\u00f3digo da aplica\u00e7\u00e3o, n\u00e3o do modelo. Isso n\u00e3o apenas dificultava a reprodutibilidade entre provedores, como tamb\u00e9m contaminava compara\u00e7\u00f5es de desempenho, j\u00e1 que varia\u00e7\u00f5es na estrutura do prompt impactavam diretamente no consumo de tokens e na coer\u00eancia das respostas.<\/p>\n<p><\/p>\n<p>A migra\u00e7\u00e3o para <em>ChatOllama <\/em>resolve esse problema ao alinhar a interface local ao padr\u00e3o <em>BaseChatModel<\/em>, usado por OpenAI, Gemini e outros. Isso permite que:<\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>Prompts sejam compar\u00e1veis entre ambientes (local vs. cloud), j\u00e1 que a serializa\u00e7\u00e3o das mensagens segue o template esperado pelo tokenizer do modelo;<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>M\u00e9tricas de token usage sejam coletadas de forma consistente, viabilizando an\u00e1lise de custo-computa\u00e7\u00e3o mesmo em setups h\u00edbridos;<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>Permite que as pipelines de avalia\u00e7\u00e3o operem sobre um contrato est\u00e1vel, sem ajustes ad hoc por provedor.<\/li>\n<\/ul>\n<p><\/p>\n<p>Essa padroniza\u00e7\u00e3o elimina uma fonte significativa de vari\u00e2ncia n\u00e3o controlada. Em projetos onde cada token representa lat\u00eancia adicional ou custo, a capacidade de medir, comparar e otimizar o uso do modelo com base em metadados estruturados \u00e9 uma condi\u00e7\u00e3o necess\u00e1ria para tomar decis\u00f5es embasadas.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\"><strong>Refer\u00eancia<\/strong><\/h2>\n<p><\/p>\n<p>LangChain. (2025). <em>ChatOllama (JavaScript)<\/em>. LangChain JS Documentation. Recuperado em 7 de dezembro de 2025, de <a style=\"color: #00ccff;\" href=\"https:\/\/js.langchain.com\/docs\/integrations\/chat\/ollama\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/js.langchain.com\/docs\/integrations\/chat\/ollama<\/a><\/p>\n<p><\/p>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comparando a Vers\u00e3o da Classe Ollama e a Abordagem ChatOllama Quando trabalhamos com m\u00faltiplos provedores de modelos (como Ollama, Gemini, OpenAI e Azure), \u00e9 recomend\u00e1vel manter um padr\u00e3o nas tipagens e um comportamento uniforme nos projetos. Principalmente naqueles que envolvem RAG, pipelines de avalia\u00e7\u00e3o ou conversas multi-turno, qualquer inconsist\u00eancia no contrato dos modelos rapidamente se torna um gargalo t\u00e9cnico.\u00a0 Nos \u00faltimos meses, o ecossistema LangChain tem passado por mudan\u00e7as significativas, tanto na nomenclatura quanto na arquitetura interna dos seus conectores com modelos de linguagem. Um exemplo claro disso pode ser observado na migra\u00e7\u00e3o do uso da classe Ollama do LangChain para ChatOllama em aplica\u00e7\u00f5es que integram modelos locais. Al\u00e9m disso, h\u00e1 uma nova \u00eanfase na extra\u00e7\u00e3o de metadados de uso, como contagem de tokens, o que traz benef\u00edcios tanto operacionais quanto de controle de custos. O objetivo deste artigo \u00e9 apresentar os principais pontos de mudan\u00e7a nessa nova abordagem. Nota: Neste texto, o termo provedor (ou provider) \u00e9 usado no sentido comum da engenharia de IA, ou seja, refere-se \u00e0 plataforma ou servi\u00e7o que hospeda e disponibiliza um modelo de linguagem (como OpenAI, Google, Azure ou Ollama). A implementa\u00e7\u00e3o da classe Ollama A importa\u00e7\u00e3o do LangChain com o Ollama \u00e9 feito como: import { Ollama } from &#8220;@langchain\/ollama&#8221;; No entanto, essa classe gen\u00e9rica Ollama n\u00e3o estava alinhada com a interface de chat utilizada por outros provedores como OpenAI e Gemini. Isso criava inconsist\u00eancias na forma como as mensagens eram formatadas e processadas, especialmente ao usar invoke, stream ou outros m\u00e9todos do BaseChatModel.\u00a0 Al\u00e9m disso, n\u00e3o havia suporte expl\u00edcito para metadados de uso, o que dificultava o monitoramento de consumo de tokens em ambientes h\u00edbridos (ex: Ollama local + OpenAI em produ\u00e7\u00e3o). A implementa\u00e7\u00e3o Vers\u00e3o ChatOllama A importa\u00e7\u00e3o do LangChain com o ChatOllama \u00e9 feito como: import { ChatOllama } from &#8220;@langchain\/ollama&#8221;; Com a atualiza\u00e7\u00e3o temos consist\u00eancia de interface: Agora, todos os provedores (ChatOllama, ChatGoogleGenerativeAI, ChatOpenAI, etc.) herdam de BaseChatModel. Isso garante que m\u00e9todos como invoke, stream e batch funcionem da mesma forma, independentemente do provedor.\u00a0\u00a0 Tamb\u00e9m temos compatibilidade com sistemas de mem\u00f3ria e agentes: Muitos componentes do LangChain (como ConversationalRetrievalChain, AgentExecutor) esperam um BaseChatModel. Usar ChatOllama torna a integra\u00e7\u00e3o mais fluida.\u00a0 Outrossim \u00e9 o suporte a mensagens estruturadas: A nova classe trabalha com objetos do tipo BaseMessage, permitindo manipula\u00e7\u00e3o granular de HumanMessage, AIMessage, SystemMessage&#8230; A migra\u00e7\u00e3o Ao optar pela migra\u00e7\u00e3o dos projetos para a vers\u00e3o ChatOllama, temos a vantagem de trabalhar com mensagens estruturadas, nas quais o c\u00f3digo fica mais limpo, leg\u00edvel e mais alinhado \u00e0 forma como os modelos foram treinados. Al\u00e9m disso, com a formata\u00e7\u00e3o autom\u00e1tica do prompt evitamos o desperd\u00edcio de tokens em compara\u00e7\u00e3o com a formata\u00e7\u00e3o manual. Considera\u00e7\u00f5es finais Na pr\u00e1tica da ci\u00eancia de dados aplicada a LLMs, a capacidade de isolar vari\u00e1veis, modelo,\u00a0 prompt ou contexto depende diretamente da estabilidade da interface de infer\u00eancia. A utiliza\u00e7\u00e3o da classe Ollama do LangChain como inst\u00e2ncia de LLM (baseada em strings brutas) introduzia um vi\u00e9s sistem\u00e1tico: a formata\u00e7\u00e3o do prompt ficava sob responsabilidade do c\u00f3digo da aplica\u00e7\u00e3o, n\u00e3o do modelo. Isso n\u00e3o apenas dificultava a reprodutibilidade entre provedores, como tamb\u00e9m contaminava compara\u00e7\u00f5es de desempenho, j\u00e1 que varia\u00e7\u00f5es na estrutura do prompt impactavam diretamente no consumo de tokens e na coer\u00eancia das respostas. A migra\u00e7\u00e3o para ChatOllama resolve esse problema ao alinhar a interface local ao padr\u00e3o BaseChatModel, usado por OpenAI, Gemini e outros. Isso permite que: Essa padroniza\u00e7\u00e3o elimina uma fonte significativa de vari\u00e2ncia n\u00e3o controlada. Em projetos onde cada token representa lat\u00eancia adicional ou custo, a capacidade de medir, comparar e otimizar o uso do modelo com base em metadados estruturados \u00e9 uma condi\u00e7\u00e3o necess\u00e1ria para tomar decis\u00f5es embasadas. Refer\u00eancia LangChain. (2025). ChatOllama (JavaScript). LangChain JS Documentation. Recuperado em 7 de dezembro de 2025, de https:\/\/js.langchain.com\/docs\/integrations\/chat\/ollama \u00a0<\/p>\n","protected":false},"author":786,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[55,26],"tags":[],"class_list":["post-205283","post","type-post","status-publish","format-standard","hentry","category-inteligencia_artificial","category-publicacoes-ligo"],"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"Hellem Correa","author_link":"https:\/\/goias.gov.br\/ligo\/author\/hellemsantos\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/goias.gov.br\/ligo\/categoria\/publicacoes-ligo\/inteligencia_artificial\/\" rel=\"category tag\">Intelig\u00eancia Artificial<\/a> <a href=\"https:\/\/goias.gov.br\/ligo\/categoria\/publicacoes-ligo\/\" rel=\"category tag\">Publica\u00e7\u00f5es Ligo<\/a>","rttpg_excerpt":"Comparando a Vers\u00e3o da Classe Ollama e a Abordagem ChatOllama Quando trabalhamos com m\u00faltiplos provedores de modelos (como Ollama, Gemini, OpenAI e Azure), \u00e9 recomend\u00e1vel manter um padr\u00e3o nas tipagens e um comportamento uniforme nos projetos. Principalmente naqueles que envolvem RAG, pipelines de avalia\u00e7\u00e3o ou conversas multi-turno, qualquer inconsist\u00eancia no contrato dos modelos rapidamente se&hellip;","_links":{"self":[{"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/posts\/205283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/users\/786"}],"replies":[{"embeddable":true,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/comments?post=205283"}],"version-history":[{"count":2,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/posts\/205283\/revisions"}],"predecessor-version":[{"id":205288,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/posts\/205283\/revisions\/205288"}],"wp:attachment":[{"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/media?parent=205283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/categories?post=205283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/goias.gov.br\/ligo\/wp-json\/wp\/v2\/tags?post=205283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}