Figura 4: Resultados ao usar ellmer para consultar a ragnar armazenar no console.

O my_chat$chat() Executa o método de bate -papo do objeto de bate -papo e retorna os resultados do seu console. Se você deseja uma interface da web chatbot, você pode executar ellmer‘s live_browser() função em seu objeto de bate -papo, que pode ser útil se você quiser fazer várias perguntas: live_browser(my_chat).

Figura 5: resulta em ellmerA interface de chatbot da web incorporada.

O RAG básico funcionou muito bem quando perguntei sobre tópicos, mas não para perguntas envolvendo tempo. Perguntando sobre os workshops “no próximo mês” – mesmo quando eu disse ao LLM que a data atual – não devolveu os workshops corretos.

Isso porque este pano básico está apenas procurando texto que é mais semelhante para uma pergunta. Se você perguntar “Quais eventos de visualização de dados r estão acontecendo no próximo mês?”, Você poderá acabar com um workshop em três meses. A pesquisa semântica básica geralmente perde os elementos necessários, e é por isso que temos a filtragem de metadados.

Filtragem de metadados “Sabe” o que é essencial para uma consulta – pelo menos se você a configurar dessa maneira. Este tipo de filtragem permite especificar que pedaços deve Combine certos requisitos, como um intervalo de data, e depois executa a pesquisa semântica Somente nesses pedaços. Os itens que não correspondem aos seus itens obrigatórios não serão incluídos.

Para se tornar básico ragnar Código de pano em um aplicativo RAG com filtragem de metadados, você precisa adicionar metadados como colunas separadas em seu ragnar Armazenamento de dados e verifique se um LLM sabe como e quando usar essas informações.

Para este exemplo, precisaremos fazer o seguinte:

  1. Obtenha a data de cada workshop e adicione -a como uma coluna aos pedaços de texto originais.
  2. Crie um armazenamento de dados que inclua uma coluna de data.
  3. Criar um costume ragnar Ferramenta de recuperação que informa ao LLM como filtrar datas se a consulta do usuário incluir um componente de tempo.

Vamos lá!

Etapa 1: adicione os novos metadados

Se você tiver sorte, seus dados já têm os metadados que deseja em um formato estruturado. Infelizmente, não há tal sorte aqui, já que os workshops para as listagens da Ucrânia são o texto HTML. Como podemos obter a data de cada workshop futuro?

É possível fazer alguns metadados analisando com expressões regulares. Mas se você estiver interessado em usar a IA generativa com r, vale a pena saber pedir ao LLMS para extrair dados estruturados. Vamos fazer um desvio rápido para isso.

Podemos solicitar dados estruturados com ellmer‘s parallel_chat_structured() Em três etapas:

  • Defina a estrutura que queremos.
  • Crie prompts.
  • Envie esses avisos para um LLM.

Podemos extrair o título do workshop com um regex – uma tarefa fácil, já que todos os títulos começam com ### E termine com uma quebra de linha:


ukraine_chunks 
  mutate(title = str_extract(text, "^### (.+)n", 1))

Defina a estrutura desejada

A primeira coisa que faremos é definir a estrutura de metadados que queremos que um LLM retorne para cada item de oficina. O mais importante é a data, que será sinalizada como não é necessário, pois os workshops anteriores não os incluíram. ragnar O criador Tomasz Kalinowski sugere que também incluímos a afiliação do orador e do alto -falante, o que parece útil. Podemos salvar a estrutura de metadados resultantes como um ellmer Modelo “TypeObject”:


type_workshop_metadata 

Crie solicitações para solicitar que dados estruturados

O código abaixo usa ellmer‘s interpolate() função para criar um vetor de avisos usando esse modelo, um para cada pedaço de texto:


prompts 

Envie todos os avisos para um LLM

Este próximo pedaço de código cria um objeto de bate -papo e depois usa parallel_chat_structured() Para executar todos os prompts. O chat e prompts vetor são argumentos necessários. Nesse caso, também discarei de volta os números padrão de solicitações e solicitações ativas por minuto com o max_active e rpm Argumentos, então eu não atingi meus limites da API (o que geralmente acontece na minha conta do Openai no padrão):


chat 

Finalmente, adicionamos os resultados extraídos ao ukraine_chunks quadro de dados e salve esses resultados. Dessa forma, não precisaremos executar novamente todo o código mais tarde se precisarmos desses dados novamente:


ukraine_chunks 
  mutate(!!!extracted, 
         date = as.Date(date))

rio::export(ukraine_chunks, "ukraine_workshop_data_results.parquet")

Se você não estiver familiarizado com o operador de emenda (!!! no código acima), está descompactando colunas individuais no quadro de dados extraídos e adicionando -as como novas colunas a ukraine_chunks através do mutate() função.

O ukraine_chunks O quadro de dados agora tem as colunas iniciadas, fim, contexto, texto, título, data, speaker_name e speaker_affiliações.

Eu ainda acabei com algumas datas antigas nos meus dados. Como o foco principal deste tutorial é o RAG e não otimizando a extração de dados, chamarei isso de bom o suficiente. Enquanto o LLM descobriu que um workshop em “Quinta-feira, 12 de setembro” não foi este ano, podemos excluir datas anteriores da maneira antiga:


ukraine_chunks 
  mutate(date = if_else(date >= Sys.Date(), date, NA))

Temos os metadados que precisamos, estruturados como queremos. O próximo passo é configurar o armazenamento de dados.

Etapa 2: Configure o armazenamento de dados com colunas de metadados

Nós queremos o ragnar armazenamento de dados para ter colunas para títuloAssim, dataAssim, SOBRE_NAMEe Speaker_affiliaçõesalém dos padrões.

Para adicionar colunas extras a um armazenamento de dados de versão, primeiro você cria um quadro de dados vazio com as colunas extras desejadas e depois usa esse quadro de dados como argumento ao criar a loja. Este processo é mais simples do que parece, como você pode ver abaixo:


my_extra_columns 

Inserir pedaços de texto do quadro de dados agmentados por metadados em um ragnar O armazenamento de dados é o mesmo de antes, usando ragnar_store_insert() e ragnar_store_build_index():


ragnar_store_insert(store, ukraine_chunks)
ragnar_store_build_index(store)

Se você está tentando atualizar itens existentes em uma loja em vez de inserir novos, você pode usar ragnar_store_update(). Isso deve verificar o hash para ver se a entrada existe e se foi alterada.

Etapa 3: Crie uma ferramenta de recuperação Ragnar personalizada

Até onde eu sei, você precisa registrar uma ferramenta personalizada com ellmer Ao fazer filtragem de metadados em vez de usar ragnaré simples ragnar_register_tool_retrieve(). Você pode fazer isso por:

  • Criando uma função R
  • Transformando essa função em uma definição de ferramenta
  • Registrando a ferramenta com um objeto de bate -papo register_tool() método

Primeiro, você escreverá uma função R convencional. A função abaixo adiciona filtragem se uma data de partida e/ou término não for nula e, em seguida, executa a recuperação do Chunk. Requer que uma loja esteja em seu ambiente global – não use store como um argumento nesta função; não vai funcionar.

Esta função primeiro configura uma expressão de filtro, dependendo se as datas são especificadas e depois adiciona a expressão do filtro como argumento a um ragnar Função de recuperação. Adicionando filtragem a ragnar_retrieve() Functions é um novo recurso até o momento em julho de 2025.

Abaixo está a função sugerida em grande parte por Tomasz Kalinowski. Aqui estamos usando ragnar_retrieve() Para obter pesquisas convencionais e semânticas, em vez de apenas VSS pesquisar. Eu adicionei “relacionado a dados” como a consulta padrão para que a função também possa lidar com perguntas relacionadas ao tempo sem um tópico:


retrieve_workshops_filtered = !!as.Date(start_date))
  } else if (!is.null(end_date)) {
    # Only end date
    filter_expr 
    select(title, date, speaker_name, speaker_affiliations, text)
}

Em seguida, crie uma ferramenta para ellmer com base nessa função usando tool()que precisa do nome da função e uma definição de ferramenta como argumentos. A definição é importante porque o LLM o usa para decidir se deve ou não usar a ferramenta para responder a uma pergunta:


workshop_retrieval_tool 

Agora crie um ellmer Converse com um prompt de sistema para ajudar o LLM a saber quando usar a ferramenta. Em seguida, registre a ferramenta e experimente! Meu exemplo está abaixo.


my_system_prompt 

Se houver de fato algum workshops relacionados ao R no próximo mês, você deve obter a resposta correta, graças ao seu novo aplicativo RAG avançado construído inteiramente em R. Você também pode criar uma interface de chatbot local com live_browser(my_chat).

E, mais uma vez, é uma boa prática fechar sua conexão quando terminar DBI::dbDisconnect(store@con).

É isso para esta demonstração, mas há muito mais que você pode fazer com R e Rag. Você quer uma interface melhor ou que você possa compartilhar? Esta amostra R Shiny Web App, escrita principalmente por Claude Opus, pode lhe dar algumas idéias.