contextos
Um artigo recente intitulado Search-R1: treinamento de LLMs para raciocinar e aproveitar os mecanismos de pesquisa com aprendizado por reforço Tese sobre o tema "O futuro das Nações Unidas" (arxiv.org/pdf/2503.09516) tem atraído muita atenção. O artigo propõe uma nova maneira de treinar modelos de linguagem grandes (LLMs) usando o aprendizado por reforço para raciocinar e explorar mecanismos de pesquisa. Vale a pena observar que algumas das ideias do artigo são semelhantes às desenvolvidas pela equipe da Qwen em QwQ-32B A exploração no modelo coincide.
O QwQ-32B da Alibaba, lançado recentemente (qwenlm.github.io/zh/blog/qwq-32b/), integra recursos relacionados ao agente no modelo de raciocínio. Esses recursos permitem que o modelo pense de forma crítica ao usar a ferramenta e adapte o processo de raciocínio com base no feedback do ambiente. Na pasta do modelo QwQ-32B no diretório added_tokens.json
você pode ver os tokens especiais adicionados para chamadas e respostas de ferramentas:
{
"</think>": 151668,
"</tool_call>": 151658,
"</tool_response>": 151666,
"<think>": 151667,
"<tool_call>": 151657,
"<tool_response>": 151665
}
Neste documento, usaremos o Agentic RAG Como exemplo, são demonstrados os recursos do modelo QwQ-32B em termos de chamada de ferramentas.
RAG autêntico vs. RAG tradicional
Para entender melhor os benefícios do RAG Autêntico, primeiro precisamos distinguir entre o RAG Autêntico e o paradigma de prática RAG predominante atualmente:
- RAG tradicionalA grande maioria dos projetos RAG atuais são essencialmente fluxos de trabalho, ou seja, sistemas que orquestram LLMs e ferramentas por meio de caminhos de código predefinidos. Esse fluxo de trabalho artificialmente predefinido e "escrito até a morte" consiste em muitas partes inter-relacionadas, mas frágeis, como roteamento, fragmentação, reordenação, interpretação de consultas, expansão de consultas, contextualização de fontes e engenharia de pesquisa.
- desvantagensÉ difícil cobrir todos os casos extremos em um fluxo de trabalho orquestrado por humanos. Especialmente em cenários complexos que exigem várias rodadas de recuperação, o efeito é mais limitado.
- RAG autênticoSimplifique o processo com uma abordagem de ponta a ponta. Basta equipar o modelo com uma ferramenta de API para recuperação em rede (no caso deste documento, usando o Tavily API, com uma certa quantidade de créditos gratuitos), o restante do trabalho é feito pelo próprio modelo, incluindo, entre outros:
- Intenção de entender (julgar se a rede é necessária)
- Reescrever ou dividir a pergunta
- chamada de interface
- Coreografia do processo (incluindo se e como realizar buscas em várias etapas)
- citar algo como fonte de algo
- ...
Em poucas palavras, o conceito central do RAG Autêntico é:Menos estrutura, mais inteligência, menos é mais.
exatamente como Antrópica Definição do modelo de agente: semelhante à Deep Search, os agentes devem executar a tarefa-alvo internamente e "direcionam dinamicamente seus próprios processos e o uso de ferramentas para controlar a maneira como a tarefa é realizada".
Processo geral
A figura a seguir ilustra o fluxo geral do Agentic RAG:
- Adapte as perguntas dos usuários para solicitar modelos de palavras.
- Chama o modelo para gerar um novo token. Se o processo de geração não resultar em um
<tool_call> ... </tool_call>
e, em seguida, o resultado do retorno é emitido diretamente. - No caso de
<tool_call> ... </tool_call>
indica que o modelo iniciou uma solicitação de chamada de ferramenta durante o processo de raciocínio. Analisando essa solicitação, executandoweb_search
e agrupa os resultados da chamada de interface em<tool_response> ... </tool_response>
emendados no contexto do macromodelo e solicitados novamente para a geração do macromodelo. - Repita as etapas acima até que não haja mais
<tool_call>
(ou o limite de solicitação é atingido) ou a presença de<|im_end|>
.
O processo é essencialmente o mesmo que o descrito no artigo Search-R1:
Principais pontos técnicos
- Modelos de palavras de taco::
user_question = input('请输入你的问题:')
max_search_times = 5
prompt = f"""You are Qwen QwQ, a curious AI built for retrival augmented generation.
You are at 2025 and current date is {date.today()}.
You have access to the web_search tool to retrival relevant information to help answer user questions.
You can use web_search tool up to {max_search_times} times to answer a user's question, but try to be efficient and use as few as possible.
Below are some guidelines:
- Use web_search for general internet queries, like finding current events or factual information.
- Always provide a final answer in a clear and concise manner, with citations for any information obtained from the internet.
- If you think you need to use a tool, format your response as a tool call with the `action` and `action_input` within <tool_call>...</tool_call>, like this:\n<tool_call>\n{{ "action": "web_search", "action_input": {{ "query": "current stock price of Tesla" }} }}\n</tool_call>.
- After using a tool, continue your reasoning based on the web_search result in <tool_response>...</tool_response>.
- Remember that if you need multi-turn web_search to find relevant information, make sure you conduct all search tasks before you provide a final answer.
---
User Question:{user_question}"""
- Sinais de parada personalizados::
Quando for detectado que o modelo acionou um processo de geração autorregressivo durante a
<tool_call>(.*?)</tool_call>\s*$
A geração é interrompida após o formato (correspondência de expressão regular):
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
StoppingCriteria,
StoppingCriteriaList
)
import torch
import re
tool_call_regex = r"<tool_call>(.*?)</tool_call>\s*$"
end_regex = r"<\|im_end\|\>\s*$"
# 同时监测: <tool_call> 或 <|im_end|>
class RegexStoppingCriteria(StoppingCriteria):
def __init__(self, tokenizer, patterns):
self.patterns = patterns
self.tokenizer = tokenizer
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
decoded_text = self.tokenizer.decode(input_ids[0])
for pattern in self.patterns:
if re.search(pattern, decoded_text, re.DOTALL):
return True
return False
stopping_criteria = StoppingCriteriaList([
RegexStoppingCriteria(
tokenizer,
patterns=[tool_call_regex, end_regex]
)
])
#model.generate(..., stopping_criteria=stopping_criteria) # 加上停止符
- API de pesquisa na Web::
A API de pesquisa usada nessa prática é a Tavily API, que oferece uma certa quantidade de créditos gratuitos para facilitar a experimentação e a replicação. A Tavily API permite que os desenvolvedores integrem a funcionalidade de pesquisa na Web em seus aplicativos por meio de chamadas simples de API.
Código de Prática
Para obter o código de prática detalhado, consulte o link a seguir:
Casos de teste
Problemas de testeDescrição: Por favor, forneça mais informações sobre o modelo QwQ-32B lançado recentemente em código aberto pela Ali.
Gerar resultados(consulte o bloco de notas para ver os resultados completos)
Como pode ser visto nos resultados, o modelo de inferência realiza de forma autônoma a compreensão da intenção (determinando se uma pesquisa em rede é necessária) e a geração de palavras-chave de pesquisa (reescrita ou divisão de perguntas). O modelo também leva em conta possíveis cenários de pesquisa em várias rodadas. Após acionar um web search
Em seguida, o modelo gera um relatório final com base nos resultados da pesquisa.
Nesse caso, o modelo concluiu apenas uma chamada à interface de pesquisa. Isso pode ser devido à simplicidade do problema do caso ou ao fato de que o modelo básico ainda não tem capacidade suficiente para acionar pesquisas complexas em várias rodadas. Isso também mostra que, para utilizar totalmente o potencial do modelo como um corpo inteligente, ainda é necessário consultar o Search-R1 para pós-treinamento e ajuste fino direcionado.
No entanto, com base nos recursos já demonstrados pelo modelo QwQ-32B, a combinação de dados de retreinamento sintéticos (ou classificados manualmente) bem projetados e o treinamento de reforço ou SFT em cenários segmentados, além de mascarar a saída retornada pela resposta da interface da ferramenta token Espera-se que essa rota de retreinamento se torne a principal corrente de desenvolvimento e implantação de inteligência no futuro, já que as perdas correspondentes podem ser pré-consideradas para uma variedade de ações e casos-limite, tornando a implantação mais simples e eliminando a necessidade de orquestração humana do fluxo de trabalho de design. O retreinamento permite a pré-consideração de várias ações e casos-limite, facilitando a implementação e eliminando a necessidade de fluxos de trabalho de design orquestrados por humanos. A seção 3.1 do documento Search-R1 descreve em detalhes o "Loss Masking for Retrieved Tokens" Tecnologia. Por meio do uso do PPO e do GRPO em que os tokens recuperados são mascarados por perdas, o Search-R1 otimiza o LLM para gerar tokens, aumentando a capacidade do modelo de interagir com mecanismos de pesquisa e realizar inferências.
Além disso, o Search-R1 oferece suporte à recuperação e à inferência em várias rodadas (Seção 3.2 "Geração de texto com chamada de mecanismo de pesquisa multi-turnos intercalados" na tese) por meio do <search>
responder cantando </search>
e coloca o conteúdo recuperado no <information>
responder cantando </information>
entre. A saída da resposta final, por outro lado, usa o <answer>
responder cantando </answer>
.