{"id":16977,"date":"2025-03-24T11:06:51","date_gmt":"2025-03-24T18:06:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16977"},"modified":"2025-06-13T16:36:16","modified_gmt":"2025-06-13T23:36:16","slug":"chat-with-your-git-history-rag-couchbase-shell","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/chat-with-your-git-history-rag-couchbase-shell\/","title":{"rendered":"Converse com seu hist\u00f3rico do Git, gra\u00e7as ao RAG e ao Couchbase Shell"},"content":{"rendered":"<p>Voc\u00ea n\u00e3o gosta de ler as mensagens de compromisso de outras pessoas? N\u00e3o? Bem, eu gosto e, enquanto lia uma mensagem de confirma\u00e7\u00e3o muito perspicaz, percebi todo o conte\u00fado inexplorado que existe em v\u00e1rios logs do Git (supondo que o desenvolvedor que voc\u00ea segue esteja escrevendo mensagens \u00fateis, \u00e9 claro). Ent\u00e3o, n\u00e3o seria \u00f3timo se voc\u00ea pudesse fazer perguntas a um reposit\u00f3rio? Vamos ver como isso pode ser feito usando o RAG com o Couchbase Shell.<\/p>\n<p>TL;DR<\/p>\n<pre class=\"wrap:true lang:sh decode:true\"># with bash, extract your commit history to json\r\nsource git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json\r\n\r\n# with cbsh, create scope, collection and collection Primary Index\r\nscopes create gitlog; cb-env scope gitlog;collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"\r\n\r\n# Import the doc in selected collection\r\nopen commitlog.json | wrap content | insert id { |it| echo $it.content.commitHash } | doc upsert\r\n\r\n# Enrich the document with default model\r\nquery \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\" | wrap content| vector enrich-doc text | doc upsert\r\n\r\n# Create a Vector Index\r\nvector create-index --similarity-metric dot_product commits textVector 1536\r\n\r\n# Run RAG\r\nvector enrich-text \"gemini\" | vector search commits textVector --neighbors 20| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask \"when and in which commit was gemini llm support added\"<\/pre>\n<h2>Configura\u00e7\u00e3o do Couchbase Shell<\/h2>\n<p>A etapa inicial \u00e9 instalar e configurar o <em>cbsh<\/em>. Vou usar minha inst\u00e2ncia do Capella. Para obter a configura\u00e7\u00e3o, voc\u00ea pode acessar a se\u00e7\u00e3o <strong>Conectar<\/strong> de seu cluster do Capella e selecione <strong>Shell do Couchbase<\/strong>. Esta \u00e9 a configura\u00e7\u00e3o em <em>[[cluster]]<\/em>. Para configurar o modelo, d\u00ea uma olhada no que est\u00e1 em<em> [[llm]]<\/em>. Eu escolhi o OpenAI, mas h\u00e1 outros. Voc\u00ea precisa definir o modelo usado para a incorpora\u00e7\u00e3o (que \u00e9 o que transforma o texto em um vetor) e um para o Chat. Esse modelo recebe a pergunta e algum contexto adicional para responder \u00e0 pergunta. E, \u00e9 claro, voc\u00ea precisar\u00e1 de uma chave de API.<\/p>\n<pre class=\"wrap:true lang:yaml decode:true\">version = 1\r\n\r\n[[llm]]\r\nidentifier = \"OpenAI\"\r\nprovider = \"OpenAI\"\r\nembed_model = \"text-embedding-3-small\"\r\nchat_model = \"gpt-3.5-turbo\"\r\napi_key = \"sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\r\n\r\n[[cluster]]\r\nidentifier = \"capella\"\r\nconnstr = \"couchbases:\/\/cb.xxxxxxx.cloud.couchbase.com\"\r\nuser-display-name = \"Laurent Doguin\"\r\nusername = \"USER\"\r\npassword = \"PASSWORD\"\r\ndefault-bucket = \"cbsh\"\r\ndefault-scope = \"gitlog\"<\/pre>\n<p>Voc\u00ea tamb\u00e9m precisa ter o Git instalado e, ent\u00e3o, estar\u00e1 tudo pronto.<\/p>\n<h2>Importar o registro de confirma\u00e7\u00e3o do Git<\/h2>\n<p>A primeira etapa \u00e9 obter todos os commits do reposit\u00f3rio em JSON. Por ser pregui\u00e7oso e velho, e por velho quero dizer que n\u00e3o estou acostumado a perguntar a uma IA, pesquisei isso no Google, encontrei v\u00e1rios Gists com links para outros Gists e, por fim, resolvi <a href=\"https:\/\/gist.github.com\/april\/ee2e104b1435f3113e67663d8875bbef\" target=\"_blank\" rel=\"noopener\">neste caso<\/a>.<\/p>\n<p>Eu o baixei, fiz o sourcing, entrei no meu reposit\u00f3rio git local do couchbase-shell e o chamei.<\/p>\n<pre class=\"nums:false lang:default decode:true\">source git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json<\/pre>\n<p>Mas, para que o leitor se pergunte se tomei a decis\u00e3o certa, vamos perguntar ao modelo configurado. A Cbsh tem um <em>perguntar<\/em> permitindo que voc\u00ea fa\u00e7a isso:<\/p>\n<pre class=\"wrap:true lang:sh decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; ask \"get the full commits in json for a git repo\"\r\n\r\nTo get the full commits in a Git repository as JSON, you can use the following command:\r\n\r\ngit log --pretty=format:'{%n \"commit\": \"%H\",%n \"author\": \"%an &lt;%ae&gt;\",%n \"date\": \"%ad\",%n \"message\": \"%f\"%n},' --date=iso --reverse --all &gt; commits.json\r\n<\/pre>\n<p>Esse comando produzir\u00e1 cada commit no reposit\u00f3rio como um objeto JSON com o hash do commit, o nome e o e-mail do autor, a data do commit e a mensagem do commit. O<code> --tudo<\/code> garante que todas as ramifica\u00e7\u00f5es sejam inclu\u00eddas. A bandeira <code>--reverso<\/code> lista os commits em ordem cronol\u00f3gica inversa. Por fim, a sa\u00edda \u00e9 redirecionada para um arquivo <code>commits.json<\/code> arquivo.<\/p>\n<p>Certifique-se de executar esse comando no diret\u00f3rio raiz do reposit\u00f3rio Git do qual voc\u00ea deseja obter os commits.<\/p>\n<p>E, como se v\u00ea, ele n\u00e3o funciona imediatamente (chocante, eu sei). E n\u00e3o tinha todas as informa\u00e7\u00f5es de que eu precisava, como a parte do corpo da mensagem. \u00c9 claro que poder\u00edamos gastar tempo ajustando isso, mas \u00e9 muito espec\u00edfico, com muitos casos extremos.<\/p>\n<p>De qualquer forma, agora tenho uma lista de commits no formato JSON:<\/p>\n<pre class=\"lang:js decode:true\">[\r\n  {\r\n  ....\r\n  },\r\n  {\r\n    \"author\": {\r\n      \"name\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"body\": \"\",\r\n    \"commitHash\": \"7a0d269fffd10045a63d40ca460deba944531890\",\r\n    \"commitHashAbbreviated\": \"7a0d269\",\r\n    \"committer\": {\r\n      \"name\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"encoding\": \"\",\r\n    \"notes\": \"\",\r\n    \"parent\": \"\",\r\n    \"parentAbbreviated\": \"\",\r\n    \"refs\": \"\",\r\n    \"signature\": {\r\n      \"key\": \"A6BCCB72D65B0D0F\",\r\n      \"signer\": \"\",\r\n      \"verificationFlag\": \"E\"\r\n    },\r\n    \"subject\": \"Initial commit\",\r\n    \"subjectSanitized\": \"Initial-commit\",\r\n    \"tree\": \"3db442f3ef0438de58f72235e2658e5368a6752b\",\r\n    \"treeAbbreviated\": \"3db442f\"\r\n}]<\/pre>\n<p>Ent\u00e3o, o que voc\u00ea pode fazer com uma matriz JSON de objetos JSON? Voc\u00ea pode import\u00e1-lo por meio da interface do usu\u00e1rio do Capella ou import\u00e1-lo com o Couchbase Shell. Primeiro, eu crio o array <em>escopo<\/em> e <em>cole\u00e7\u00e3o<\/em> e selecion\u00e1-los com cb-env e, em seguida, criar o \u00edndice SQL++.<\/p>\n<pre class=\"wrap:true lang:sh decode:true\">scopes create gitlog; cb-env scope gitlog; collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"<\/pre>\n<p>Como o cbsh \u00e9 baseado no Nushell, o arquivo JSON resultante pode ser facilmente aberto, transformado em um dataframe, transformado em um documento do Couchbase e inserido dessa forma:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; open commitlog.json |wrap content | insert id { |it| echo $it.content.commitHash }| doc upsert\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 660 \u2502 660 \u2502 0       \u2502        \u2502 capella  \u2502         \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n<\/pre>\n<p>Vamos obter alguns documentos s\u00f3 para ver como funcionou:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT subject, body FROM `commits` LIMIT 1\"\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 subject      \u2502 body \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 Bump Nushell \u2502      \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n\r\n<\/pre>\n<p>Portanto, esse \u00e9 o conte\u00fado que poder\u00edamos usar para o RAG. \u00c9 hora de enriquecer esses documentos.<\/p>\n<h2>Enrique\u00e7a o documento com um modelo de IA<\/h2>\n<p>Para enriquecer o documento, voc\u00ea precisa ter um modelo configurado. Aqui estou usando o OpenAI e o <em>enriquecer-doc<\/em> comando cbsh:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\" | wrap content| vector enrich-doc text | doc upsert\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 61        \u2502 61      \u2502 0      \u2502          \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>A cl\u00e1usula SELECT retornar\u00e1 um objeto JSON com o conte\u00fado do documento e campos adicionais <em>id<\/em> e <em>texto<\/em>. O texto \u00e9 o assunto e o corpo anexados em uma \u00fanica string. O objeto \u00e9 agrupado em um objeto de conte\u00fado e fornecido ao vetor <em>enriquecer-doc<\/em> com texto como par\u00e2metro, pois esse \u00e9 o campo que ser\u00e1 transformado em um vetor. Agora deve haver um <em>textVector<\/em> em cada documento.<\/p>\n<h2>Pesquisa de vetores<\/h2>\n<p>Para pesquisar esses vetores, precisamos criar um \u00edndice Vector Search. Isso pode ser feito por meio da API ou da interface do usu\u00e1rio para algo personaliz\u00e1vel. Aqui, estou satisfeito com as op\u00e7\u00f5es padr\u00e3o e, por isso, uso o cbsh:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector create-index --similarity-metric dot_product commits textVector 1536<\/pre>\n<p>O \u00edndice criado usar\u00e1 <em>ponto_produto<\/em> como um algoritmo de similaridade, a dimensionalidade do vetor ser\u00e1 de 1536, o nome do \u00edndice \u00e9 <em>comprometer<\/em> e o campo indexado \u00e9 <em>textVector<\/em>. O bucket, o escopo e a cole\u00e7\u00e3o s\u00e3o os selecionados por meio de <em>cb-env<\/em>.<\/p>\n<p>Para testar a pesquisa vetorial, a consulta de pesquisa deve ser transformada em um vetor e depois canalizada para a pesquisa:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"TLS support\" | vector search commits textVector\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 id                                       \u2502 score      \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 f2c1f124269884c88ab3925c7c5a8914298a2fbc \u2502 0.37283808 \u2502 capella \u2502\r\n\u2502 1 \u2502 da28adf7adbe910cd06c960d9c25d7316d666d1c \u2502 0.33915368 \u2502 capella \u2502\r\n\u2502 2 \u2502 f0f82353e7c060030cc2511ffab1edbcc263d099 \u2502 0.3294143  \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>Ele retorna 3 linhas por padr\u00e3o. Vamos estend\u00ea-lo para ver o conte\u00fado do documento. Estou adicionando <code>rejeitar -i textVector<\/code> para remover o campo vetorial, pois ningu\u00e9m precisa de um campo de 1536 linhas na sa\u00edda do terminal:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16978\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png\" alt=\"\" width=\"900\" height=\"896\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-768x765.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1320x1314.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h2>Pergunte ao seu reposit\u00f3rio Git<\/h2>\n<p>A partir da\u00ed, voc\u00ea tem todos os commits de um reposit\u00f3rio Git armazenados no Couchbase, enriquecidos com um modelo de IA, e todos indexados e pesquis\u00e1veis. A \u00faltima coisa a fazer \u00e9 chamar o modelo para executar uma consulta com o RAG. Ele come\u00e7a transformando uma pergunta em um vetor, canaliza-a para uma pesquisa de vetor, obt\u00e9m o documento completo a partir dos IDs de retorno, seleciona o objeto de conte\u00fado sem o campo de vetor, transforma cada objeto em um documento JSON (dessa forma, podemos enviar o conte\u00fado e seus metadados estruturados), envolve o <em>jsonText<\/em> em uma tabela e, por fim, canaliz\u00e1-lo para o <em>perguntar<\/em> comando:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"gemini\" | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask \"when and in which commit was gemini llm support added\"\r\nEmbedding batch 1\/1\r\nGemini LLM support was added in the commit with the subject \"Add support for Gemini llm\". This commit was authored by Jack Westwood on May 15, 2024, with the commit hash \"3da9b4a3532ab4f432428319361909cc14a035af\".\r\n\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; git show 3da9b4a3532ab4f432428319361909cc14a035af\r\ncommit 3da9b4a3532ab4f432428319361909cc14a035af\r\nAuthor: Jack Westwood &lt;jack.westwood@couchbase.com&gt;\r\nDate: Wed May 15 15:40:13 2024 +0100\r\n\r\nAdd support for Gemini llm\r\n....<\/pre>\n<p>Perguntar ao LLM quando o suporte ao Gemini foi introduzido. Obtemos uma data e um hash de confirma\u00e7\u00e3o. Assim, \u00e9 f\u00e1cil verificar usando <code>git show<\/code>. H\u00e1 um pouco de repeti\u00e7\u00e3o aqui, portanto, voc\u00ea pode declarar uma vari\u00e1vel para sua pergunta e reutiliz\u00e1-la:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; let question = \"why was the client crate rewritten? \"; vector enrich-text $question | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask $question\r\nEmbedding batch 1\/1\r\nThe client crate was rewritten to address issues such as inconsistency, difficulty in usage, and code organization. The rewrite split the client into key-value (kv) and HTTP clients, each consuming a common HTTP handler. This separation into multiple clients and files improved code organization and made the clients easier to understand and use. Additionally, various improvements were made to the HTTP handler, errors, and runtime instantiation within the client crate to enhance overall functionality and performance. The rewrite effort aimed to streamline the client crate, making it more robust, maintainable, and user-friendly.<\/pre>\n<p>E agora todos n\u00f3s sabemos por que a grade do cliente teve de ser reescrita. Talvez isso n\u00e3o responda \u00e0s suas perguntas, mas agora voc\u00ea sabe como obter respostas de qualquer reposit\u00f3rio!<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Comece a usar <a href=\"https:\/\/cloud.couchbase.com\" target=\"_blank\" rel=\"noopener\">Capella de gra\u00e7a<\/a><\/li>\n<li>Leia nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/llm-embeddings\/\" target=\"_blank\" rel=\"noopener\">Guia para LLM Embeddings<\/a><\/li>\n<li>Leia mais sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\" target=\"_blank\" rel=\"noopener\">meus blogs de desenvolvedores<\/a> sobre pesquisa de vetores e muito mais<\/li>\n<li>Tente <a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\">Shell do Couchbase<\/a> hoje<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16979\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png\" alt=\"\" width=\"646\" height=\"643\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-2048x2038.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1320x1314.png 1320w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Don&#8217;t you love reading other people&#8217;s commit messages? No? Well, I do and as I was reading a very insightful commit message, I realized all the untapped content living in various Git logs (assuming the dev you follow are writing [&hellip;]<\/p>","protected":false},"author":49,"featured_media":16986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10122,1815,2225,1816,9973,2201,9937],"tags":[10023,10020,10024,10038,9924],"ppma_author":[9023],"class_list":["post-16977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence-ai","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-generative-ai-genai","category-tools-sdks","category-vector-search","tag-cbsh","tag-cbshell","tag-couchbase-shell","tag-nushell","tag-rag-retrieval-augmented-generation"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\" \/>\n<meta property=\"og:description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-24T18:06:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:36:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"wordCount\":980,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"keywords\":[\"cbsh\",\"cbshell\",\"couchbase shell\",\"nushell\",\"RAG retrieval-augmented generation\"],\"articleSection\":[\"Artificial Intelligence (AI)\",\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"Generative AI (GenAI)\",\"Tools &amp; SDKs\",\"Vector Search\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"description\":\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"width\":2400,\"height\":1256,\"caption\":\"Couchbase Shell and RAG\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","description":"Transforme seu hist\u00f3rico do Git em uma base de conhecimento pronta para o bate-papo usando o RAG e o Couchbase Shell.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/chat-with-your-git-history-rag-couchbase-shell\/","og_locale":"pt_BR","og_type":"article","og_title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","og_description":"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/chat-with-your-git-history-rag-couchbase-shell\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-03-24T18:06:51+00:00","article_modified_time":"2025-06-13T23:36:16+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","type":"image\/jpeg"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"wordCount":980,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","keywords":["cbsh","cbshell","couchbase shell","nushell","RAG retrieval-augmented generation"],"articleSection":["Artificial Intelligence (AI)","Best Practices and Tutorials","Couchbase Capella","Couchbase Server","Generative AI (GenAI)","Tools &amp; SDKs","Vector Search"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","url":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","description":"Transforme seu hist\u00f3rico do Git em uma base de conhecimento pronta para o bate-papo usando o RAG e o Couchbase Shell.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","width":2400,"height":1256,"caption":"Couchbase Shell and RAG"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=16977"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/16986"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=16977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=16977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=16977"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=16977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}