Original: https://arxiv.org/abs/2409.09030
resumos
Nos últimos anos, os modelos de linguagem grande (LLMs) obtiveram um sucesso notável e foram amplamente utilizados em uma variedade de tarefas downstream, especialmente em tarefas no domínio da engenharia de software (SE). Descobrimos que a noção de intelligentsia é explícita ou implicitamente adotada em muitos estudos que combinam LLMs com SE. No entanto, falta um trabalho de pesquisa aprofundado para classificar a linhagem de desenvolvimento do trabalho existente, analisar como o trabalho existente combina técnicas de corpo inteligente baseadas em LLM para otimizar vários tipos de tarefas e esclarecer a estrutura de corpos inteligentes baseados em LLM em SE. Neste artigo, apresentamos o primeiro levantamento de pesquisas sobre a combinação de inteligências LLM com SE e propomos uma estrutura para inteligências LLM em SE que inclui três módulos principais: percepção, memória e ação. Também resumimos os desafios atuais encontrados na combinação dos dois domínios e sugerimos oportunidades futuras para abordá-los. Mantemos um repositório GitHub de artigos relacionados em:https://github.com/DeepSoftwareAnalytics/Awesome-Agent4SE.
1 Introdução
Nos últimos anos, os modelos de linguagem grande (LLMs) obtiveram um sucesso notável e foram amplamente utilizados em muitas tarefas downstream, especialmente em uma variedade de tarefas no campo da engenharia de software (SE) Zheng et al.conforme resumido no código Ahmed et al. (2024); Sun et al. (2023b); Haldar e Hockenmaier (2024); Mao et al. (2024); Guo et al. (2023); Wang et al. (2021), geração de código Jiang et al. (2023a); Hu et al. (2024b); Yang et al. (2023a); Tian e Chen (2023); Li et al. (2023e); Wang et al. (2024b), tradução de código Pan et al. (2024), detecção e correção de vulnerabilidades Zhou et al. (2024); Islã e Najafirad (2024); de Fitero-Dominguez et al. (2024); Le et al. (2024); Liu et al. (2024b); Chen et al. (2023a), etc. O conceito de inteligíveis é introduzido a partir do campo da IA, explícita ou implicitamente, em muitos estudos que combinam LLM com SE. O uso explícito implica que o artigo se refere diretamente à aplicação de tecnologias relacionadas a inteligíveis, ao passo que o uso implícito sugere que, embora o conceito de inteligíveis seja usado, ele pode ser apresentado usando uma terminologia diferente ou de alguma outra forma.
Intelligentsia Wang et al. (2024c) representa uma entidade inteligente capaz de perceber, raciocinar e executar ações. Ela serve como uma importante base tecnológica para a realização de várias tarefas e objetivos, detectando o estado do ambiente e selecionando ações com base em seus objetivos e design para maximizar métricas de desempenho específicas. As inteligências baseadas em LLM geralmente usam LLMs como o núcleo cognitivo das inteligências e se destacam em cenários como automação, controle inteligente e interação humano-computador, aproveitando os recursos poderosos dos LLMs na compreensão e geração de linguagem, aprendizado e raciocínio, consciência e memória de contexto e multimodalidade. Com o desenvolvimento de vários campos, os conceitos de inteligências tradicionais e baseadas em LLM são gradualmente esclarecidos e amplamente utilizados no campo do processamento de linguagem natural (NLP).2023). No entanto, embora os trabalhos existentes usem esse conceito explícita ou implicitamente na ES, ainda não há uma definição clara de inteligíveis. Falta um artigo de pesquisa aprofundado para analisar como os trabalhos existentes incorporam técnicas de corpos inteligentes para otimizar várias tarefas, para classificar a linhagem de desenvolvimento dos trabalhos existentes e para esclarecer a estrutura dos corpos inteligentes no SE.
Neste artigo, apresentamos uma análise aprofundada da pesquisa sobre a combinação de agentes baseados em Large Language Model (LLM) com engenharia de software (SE), resumimos os desafios atuais enfrentados ao combinar os dois e sugerimos possíveis oportunidades para pesquisas futuras em resposta aos desafios existentes. Especificamente, primeiro coletamos artigos relacionados à aplicação da tecnologia de agentes baseados em LLM em SE e obtivemos 115 artigos após filtragem e avaliação de qualidade. Em seguida, inspirados pela definição tradicional de agente (Wang et al.2024cXi et al.2023), apresentamos uma estrutura conceitual genérica para agentes baseados em LLM no SE (consulte a Seção 2 seções), incluindo os três componentes principais de percepção, memória e ação. Primeiro, apresentamos o módulo de percepção (consulte a Seção 2.1 Seção), esse módulo pode lidar com entradas de diferentes modalidades, como entrada textual, entrada visual, entrada auditiva, etc. Em seguida, apresentamos o módulo de memória (consulte a Seção 2.2 Seção), esse módulo inclui memória semântica, memória de enredo e memória processual para ajudar o agente a tomar decisões fundamentadas. Por fim, apresentamos o módulo de ação (consulte a Seção 2.3 Seção), o módulo inclui ações internas, como raciocínio, recuperação e aprendizado, bem como ações externas, como a interação com o ambiente.
Em seguida, detalhamos os desafios e as oportunidades dos agentes baseados em LLM no SE (consulte a Seção 3 seções). Especificamente, propomos as seguintes oportunidades de pesquisa futura para os agentes LLM abordarem os desafios atuais no SE:
- A maioria dos estudos existentes explora principalmente o módulo de percepção de entrada de texto baseado em tokens, enquanto falta a exploração de outras modalidades.
- Muitas tarefas novas permanecem fora do escopo do aprendizado de LLM, e as tarefas complexas no domínio de SE exigem agentes com vários recursos. Portanto, é fundamental explorar como os agentes baseados em LLM podem assumir novas funções e equilibrar com eficácia os recursos de várias funções.
- O domínio SE carece de uma base de conhecimento autorizada e reconhecida que contenha uma grande quantidade de conhecimento relacionado a códigos como base para recuperação externa.
- A atenuação da ilusão dos agentes LLM melhora o desempenho geral do agente, e a otimização do agente, por sua vez, atenua o problema da ilusão do agente LLM.
- O processo de colaboração entre vários agentes requer recursos computacionais significativos, além de sobrecargas de comunicação adicionais devido à sincronização e ao compartilhamento de várias informações. A exploração de técnicas para melhorar a eficiência da colaboração entre vários agentes também é uma oportunidade para trabalhos futuros.
- As tecnologias no campo da ES também podem contribuir para o desenvolvimento do campo do agente, e é necessário mais trabalho no futuro para explorar como incorporar tecnologias avançadas no campo da ES no agente e promover o avanço tanto do agente quanto do campo da ES.
Além disso, as técnicas de SE, especialmente as relacionadas ao código, também podem fazer avançar o campo dos agentes, demonstrando a relação de reforço mútuo entre esses dois campos muito diferentes. No entanto, poucos trabalhos exploraram a aplicação de técnicas de ES a agentes, e as pesquisas ainda se concentram em técnicas básicas simples de ES, como chamadas de função, solicitações HTTP e outras ferramentas. Portanto, este artigo se concentra em trabalhos relacionados a agentes no campo da SE e, na seção 3.6 SeçãoA aplicação de técnicas de SE a agentes é discutida brevemente como uma oportunidade para pesquisas futuras.
2 Agentes SE baseados no Large Language Model (LLM)
Depois de reunir e analisar a pesquisa obtida durante o período de coleta de dados, propomos uma estrutura de agente de engenharia de software (SE) baseada no Large Language Model (LLM). Conforme mostrado na Fig. 2 Como mostrado, um único agente contém três módulos principais: percepção, memória e ação. Especificamente, o módulo de percepção recebe informações multimodais do ambiente externo e as converte em uma forma de entrada que o LLM pode entender e processar. O módulo de ação inclui ações internas e externas, que são responsáveis por decisões de raciocínio com base nas entradas do LLM e pela otimização de decisões com base no feedback obtido da interação com o ambiente externo, respectivamente. O módulo de memória inclui memórias semânticas, situacionais e processuais que podem fornecer informações adicionais úteis para ajudar o LLM a tomar decisões fundamentadas. Além disso, o módulo de ação pode atualizar diferentes memórias no módulo de memória por meio de ações de aprendizagem para fornecer informações de memória mais eficazes para operações de raciocínio e recuperação. Além disso, a colaboração multiagente consiste em vários agentes individuais que são responsáveis por parte da tarefa e trabalham juntos para concluí-la por meio da cooperação colaborativa. Esta seção apresenta os detalhes de cada módulo da estrutura de agente SE baseada em LLM.
2.1 Percepção
O módulo perceptual conecta o agente baseado em LLM ao ambiente externo e é fundamental para o processamento de entradas externas. Ele processa diferentes entradas modais, como entradas textuais, visuais e auditivas, e as converte em um formato incorporado que pode ser compreendido e processado pelo agente LLM, estabelecendo a base para o raciocínio e o comportamento de tomada de decisão do agente LLM. A seguir, apresentamos os detalhes das diferentes entradas modais no módulo perceptual.
2.1.1 Entrada de texto
Diferentemente dos formatos de entrada de texto no Processamento de Linguagem Natural (NLP), que levam em conta as características do código, os formatos de entrada de texto no SE incluem o texto com base na Token entradas, entradas baseadas em árvores/gráficos e entradas híbridas.
Entrada baseada em token. Entradas baseadas em tokens (Ahmed et al. 2024; Al-Kaswan et al. 2023Arakelyan et al. 2023; Beurer-Kellner et al. 2023:: Alqarni e Azim. 2022; Li et al. 2022bGu et al. 2022Du et al. 2021) é a abordagem de entrada mais dominante, que trata o código diretamente como texto de linguagem natural e usa sequências de tokens diretamente como entrada para o LLM, ignorando as propriedades do código.
Entrada baseada em árvore/diagrama. Em contraste com as linguagens naturais, os códigos têm regras estruturais e sintáticas rígidas e geralmente são escritos de acordo com a sintaxe de uma linguagem de programação específica. Com base nas características do código, a entrada baseada em árvore/diagrama (Ma et al. 2023b, aZhang et al. 2023g:: Ochs et al. 2023Bi et al. 2024Shi et al. 2023a, 2021; Wang e Li. 2021) podem transformar o código em estruturas de árvore, como árvores de sintaxe abstratas, ou estruturas gráficas, como gráficos de fluxo de controle, para modelar informações estruturadas sobre o código. No entanto, o trabalho atual relacionado aos agentes SE baseados em LLM não explorou essas modalidades, o que apresenta desafios e oportunidades.
Entrada híbrida. Entradas mistas (Niu et al. 2022; Hu et al. 2024aGuo et al. 2022) combina várias modalidades para fornecer diferentes tipos de informações ao LLM. Por exemplo, a inclusão de entradas híbridas baseadas em tokens e em árvores pode combinar informações semânticas e estruturais sobre o código, levando a uma melhor modelagem e compreensão do código. No entanto, o trabalho relacionado aos agentes baseados em LLM no SE ainda não explorou essa modalidade também.
2.1.2 Entrada visual
A entrada visual usa dados de imagens visuais, como esboços de interface do usuário ou diagramas de design UML, como entrada modal e toma decisões inferenciais ao modelar e analisar as imagens. Muitos trabalhos relacionados à PNL exploram essa modalidade. Por exemplo, Driess et al. (2023) propõe o PaLM-E, um modelo de linguagem multimodal incorporado cujas entradas são sentenças multimodais entrelaçadas com estimativas visuais, de estado contínuo e codificação de entrada textual. Os domínios tradicionais de engenharia de software também têm tarefas de entrada visual, como a pesquisa de código da interface do usuário (Behrang et al.2018; Reiss et al.2014; Xie et al.2019), que usa esboços da interface do usuário como consultas para encontrar trechos de código úteis. No entanto, ainda há menos trabalhos sobre modelagem visual como entrada para o LLM.
2.1.3 Entrada auditiva
A entrada auditiva interage com os LLMs na forma de fala, usando dados auditivos, como áudio, como entrada. Os domínios tradicionais de engenharia de software têm tarefas para entrada auditiva, como a programação de pesquisas de vídeo (Bao et al.2020), que usa vídeo como fonte de trechos de código úteis. No entanto, também há uma relativa falta de trabalho relacionado à entrada auditiva para LLM.
2.2 Memória
Os módulos de memória incluem memória semântica, memória situacional e memória processual, que podem fornecer informações úteis adicionais para ajudar os LLMs a tomar decisões fundamentadas. A seguir, apresentaremos os detalhes de cada um desses três tipos de memória.
2.2.1 Memória semântica
As memórias semânticas armazenam o conhecimento mundial reconhecido dos agentes de LLM, geralmente na forma de repositórios externos de recuperação de conhecimento que incluem documentos, bibliotecas, APIs ou outros conhecimentos. Muitos estudos exploraram a aplicação da memória semântica (Wang et al.2024b; Zhang et al.2024Eghbali e Pradel.2024; Patel et al.2023; Zhou et al.2022; Ren et al.2023; Zhang et al.2023d). Especificamente, a documentação e as APIs são as informações mais comuns encontradas em bases de conhecimento externas. Por exemplo, Zhou et al. (2022) propôs um novo método de geração de linguagem natural para código chamado DocPrompting, que explora explicitamente documentos com base na intenção da linguagem natural, recuperando fragmentos de documentos relevantes.Zhang et al. (2024) construíram um benchmark de agrupamento manual chamado CODEAGENTBENCH dedicado à geração de código no nível da base de código, contendo documentação, dependências de código e informações sobre o ambiente de tempo de execução.2023) propuseram um novo método de geração de código baseado em encadeamento de prompts orientado pelo conhecimento, denominado KPC, que usa o conhecimento de tratamento de exceções de granularidade fina extraído da documentação da API para auxiliar o LLM na geração de código. Além da documentação, as APIs também são informações comuns em bases de conhecimento externas. Por exemplo, Eghbali e Pradel (2024) propôs uma técnica de preenchimento de código baseada em LLM chamada De-Hallucinator, que identifica automaticamente referências de API específicas do projeto relacionadas a prefixos de código e previsões iniciais do modelo e adiciona informações sobre essas referências às dicas.Zhang et al. (2023d) A integração de uma ferramenta de pesquisa de API no processo de geração permite que o modelo selecione automaticamente as APIs e use a ferramenta de pesquisa para obter sugestões. Além disso, alguns trabalhos também abordaram outras informações. Por exemplo, Patel et al. (2023) examinaram os recursos e as limitações de diferentes LLMs ao gerar código com base no contexto.Wang et al. (2024b) Ajuste fino de LLMs de código selecionados usando funções de aprimoramento e suas cadeias de documentação correspondentes.
2.2.2 Memória situacional
A memória situacional registra o conteúdo relevante para o caso atual, bem como as informações empíricas obtidas em processos anteriores de tomada de decisão. O conteúdo relacionado ao caso atual (por exemplo, informações relevantes encontradas em bancos de dados de pesquisa, amostras fornecidas por meio de técnicas de aprendizagem no contexto (ICL) etc.) pode fornecer conhecimento adicional para o raciocínio de LLM e, portanto, muitos estudos introduziram essas informações no processo de raciocínio de LLM (Zhong et al.2024; Li et al.2023c; Feng e Chen.2023; Ahmed et al.2023; Wei et al.2023a; Ren et al.2023; Zhang et al.2023bEghbali e Pradel.2024; Shi et al.2022). Por exemplo, Li et al. (2023c) propôs uma nova técnica de dicas chamada AceCoder, que seleciona programas semelhantes como exemplos nas dicas, fornecendo uma grande quantidade de conteúdo (por exemplo, algoritmos, APIs) relacionado ao código de destino.Feng e Chen (2023) propuseram o AdbGPT, uma abordagem leve, sem treinamento e codificação, que reproduz automaticamente erros com base em relatórios de erros usando técnicas de aprendizado no contexto.Ahmed et al. (2023) descobriram que a inclusão de fatos semânticos pode ajudar o LLM a melhorar o desempenho da tarefa de resumo de código.Wei et al. (2023a) propõe um novo modelo chamado Coeditor, que prevê edições em regiões de código com base em alterações recentes na mesma base de código em uma configuração de edição automática de código em várias rodadas. Além disso, a introdução de informações empíricas, como informações históricas de interação, pode ajudar os agentes baseados em LLM a entender melhor o contexto e a tomar decisões corretas. Alguns trabalhos usam informações empíricas de processos anteriores de raciocínio e tomada de decisão para obter respostas mais precisas por meio de consultas e modificações iterativas das respostas. Por exemplo, Ren et al. (2023) propôs o KPC, uma abordagem de geração de código baseada em encadeamento de prompts orientada pelo conhecimento que decompõe a geração de código em cadeias de IA com etapas iterativas de verificação e reescrita.2023b) propuseram o RepoCoder, uma estrutura simples, versátil e eficaz que utiliza de forma eficiente as informações de nível de base de código para conclusão de código em um pipeline de geração de recuperação iterativa.Eghbali e Pradel (2024) propuseram o De-Hallucinator, uma técnica de preenchimento de código baseada em LLM que recupera referências de API adequadas aumentando gradualmente as informações contextuais nas dicas e iterando o modelo de consulta para tornar suas previsões mais precisas.
2.2.3 Memória processual
A memória processual de um agente na engenharia de software consiste em conhecimento implícito armazenado nos pesos do Modelo de Linguagem Ampla (LLM) e conhecimento explícito escrito no código do agente.
O conhecimento implícito é armazenado nos parâmetros do LLM. Os estudos existentes geralmente propõem novos LLMs com conhecimento implícito rico para várias tarefas downstream, treinando modelos usando grandes quantidades de dados.Zheng et al. (2023) organizou o LLM de código no domínio SE de acordo com seu tipo de afiliação (incluindo empresas, universidades, equipes de pesquisa e comunidades de código aberto, indivíduos e colaboradores anônimos).
Conhecimento explícito Escrito no código do agente para permitir que o agente seja executado automaticamente. Vários trabalhos, Patel et al. (2023); Shin et al. (2023); Zhang et al. (2023a) exploraram diferentes maneiras de construir o código do agente. Especificamente, Patel et al. (2023) usam três tipos de supervisão contextual para especificar funções de biblioteca, incluindo demonstrações, descrições e implementações.Shin et al. (2023) investigaram a eficácia de três técnicas diferentes de engenharia de dicas (ou seja, dicas básicas, aprendizado contextual e dicas específicas da tarefa) com LLM de ajuste fino em três tarefas típicas de ASE. Zhang et al. (2023a) explorou o uso de diferentes designs de dicas (ou seja, dicas básicas, dicas de informações de apoio e dicas de raciocínio em cadeia) por meio do ChatGPT Desempenho da detecção de vulnerabilidades de software.
2.3 Movimento
O módulo de ação consiste em dois tipos: ações internas e externas. As ações externas interagem com o ambiente externo para obter feedback, incluindo o diálogo com humanos/agentes e a interação com o ambiente digital, enquanto as ações internas raciocinam e tomam decisões com base nas entradas do LLM e otimizam as decisões com base no feedback obtido, incluindo ações de inferência, recuperação e aprendizado. A seguir, descreveremos cada ação em detalhes.
2.3.1 Ações internas
As ações internas incluem ações de raciocínio, recuperação e aprendizado. Separadamente, a ação de raciocínio é responsável por analisar o problema, raciocinar e tomar decisões com base nas entradas do agente LLM. As ações de recuperação recuperam informações relevantes da base de conhecimento e ajudam as ações de raciocínio a tomar decisões corretas. As ações de aprendizado, por outro lado, aprendem e atualizam continuamente o conhecimento por meio do aprendizado e da atualização das memórias semântica, processual e situacional, melhorando, assim, a qualidade e a eficiência do raciocínio e da tomada de decisões.
Ações de raciocínio. Um processo de raciocínio rigoroso é fundamental para que os agentes de LLM concluam as tarefas, e o Chained Thinking (CoT) é uma forma eficaz de raciocínio. Com a ajuda do CoT, os LLMs podem entender profundamente os problemas, decompor tarefas complexas e gerar respostas de alta qualidade. Conforme mostrado na figura 3 Conforme mostrado, as pesquisas existentes exploraram diferentes formas de CoT, incluindo CoT/planejamento simples, SCoT, brainstorming e CoT em árvore. Especificamente, uma CoT/planejamento simples é um parágrafo no prompt que descreve o processo de raciocínio do problema. Nos primeiros trabalhos, uma frase simples foi incluída no prompt para orientar o LLM a gerar pensamento em cadeia para uma melhor solução de problemas. Por exemplo, Hu et al. (2024bÉ proposta uma abordagem de aprendizado de contexto para orientar a depuração de LLM usando o método de "depuração de impressão". À medida que a tecnologia LLM evolui, o projeto de CoTs se torna mais complexo. Inspirados pelo processo dos desenvolvedores de verificar a viabilidade dos cenários de teste, Su et al. (2023) projetou o raciocínio Chained Thinking (CoT) para extrair o conhecimento humanoide e o raciocínio lógico do LLM.Le et al. (2023) propôs uma nova estrutura chamada CodeChain, que gera cadeias autocorretivas guiadas por um número de submódulos representativos gerados em iterações anteriores.Huang et al. (2024) propuseram o CodeCoT, que gera casos de teste para verificar se há erros de sintaxe no código durante a execução e, em seguida, combina o pensamento em cadeia com o processo de autoverificação da geração de código por meio de uma fase de autoverificação.Tian e Chen (2023) apresenta uma nova técnica de solicitação, projeta solicitações sofisticadas de pensamento e feedback baseado em solicitação e explora, pela primeira vez, como melhorar o desempenho da geração de código dos LLMs.
Considerando as características do código, algumas pesquisas propuseram um CoT (Chain of Thought) estruturado para introduzir informações estruturais do código. Conforme mostrado na Fig. 3 Conforme mostrado em (b), a CoT estruturada apresenta o processo de raciocínio em uma forma semelhante a um pseudocódigo, envolvendo loops, ramificações e outras estruturas. Por exemplo, Li et al. (2023a) propuseram Structured CoTs (SCoTs), que podem utilizar efetivamente as ricas informações estruturais no código-fonte, e uma nova técnica de geração de código, SCoT hinting.Christianos et al. (2023) propõe um modelo de estrutura genérica que usa a construção de funções intrínsecas e extrínsecas para aumentar a compreensão da estrutura de raciocínio e incorporar o raciocínio estruturado às estratégias das inteligências de IA. Além disso, vários estudos propuseram outras formas de CoT, como brainstorming e CoT em árvore, conforme mostrado na Figura 3 (c) e (d) a seguir. O brainstorming se baseia na geração de palavras-chave relevantes com base na entrada. Por exemplo, Li et al. (2023e) propuseram uma nova estrutura de brainstorming para geração de código que utiliza etapas de brainstorming para gerar e selecionar diferentes ideias, facilitando o raciocínio algorítmico antes da geração de código. O Tree CoT é um exemplo de Feng e Chen (2023), que explora e atualiza dinamicamente a CoT com nós na árvore em vários estados, incluindo nós concluídos, novos, recém-derivados e pendentes.
Além disso, vários estudos exploraram outras técnicas para aprimorar a capacidade de raciocínio e a eficiência de raciocínio das inteligências com base em grandes modelos de linguagem. Por exemplo, Wang et al. (2024a) propuseram o TOOLGEN, que consiste em uma fase de inserção de gatilho e ajuste fino do modelo (off-line) e uma fase de geração de código de integração de ferramentas (on-line). O TOOLGEN utiliza aprimoramentos no corpus de código fornecido para inferir onde acionar o autocompletar de ferramentas e marcar o token especial Token.Yang et al. (2023a) desenvolveram um novo método, o COTTON, que gera automaticamente CoTs gerados por código usando um modelo de linguagem leve. Zhang et al. (2023c) propuseram a decodificação por autoinferência, um novo esquema de inferência que gera rascunhos de tokens e, em seguida, verifica a saída de tokens desses rascunhos usando o modelo de bigrama original por meio de uma única passagem direta.Zhou et al. (2023) apresenta uma estrutura de solução adaptável, que ajusta estrategicamente a estratégia de solução de acordo com a dificuldade do problema, o que não só aumenta a eficiência computacional, mas também melhora o desempenho geral.
Operações de recuperação. As operações de recuperação recuperam informações relevantes da base de conhecimento para ajudar as operações de raciocínio a tomar as decisões corretas. A entrada usada para a recuperação e o tipo de conteúdo de saída obtido por meio da recuperação variam. Conforme mostrado na Tabela 1 Conforme mostrado, as entradas e saídas podem ser texto, código ou mensagens mistas contendo texto e código. Especificamente, elas podem ser classificadas nas seguintes categorias: (1) Texto-código. Normalmente, os requisitos são usados como entradas para recuperar códigos relevantes ou APIs usadas, que são adicionadas aos prompts para gerar códigos de resposta. Por exemplo, Zan et al. (2022a) propõem uma nova estrutura que inclui os módulos APIRetriever e APICoder. Especificamente, o APIRetriever recupera APIs úteis e, em seguida, o APICoder usa essas APIs recuperadas para gerar código. de-Hallucinator Eghbali e Pradel (2024) Recupere as referências de API apropriadas por meio de dicas e use as dicas obtidas para consultar iterativamente o modelo. (2) Texto-Texto. Às vezes, os requisitos também são usados como entrada para recuperar documentos relevantes ou perguntas semelhantes para ajudar a concluir a tarefa. Por exemplo, Zhou et al. (2022) introduziram o DocPrompting, um método de geração de código em linguagem natural que responde explicitamente a uma determinada intenção de NL recuperando fragmentos de documentos relevantes. Zhang et al. (2024) propõe o CodeAgent, uma nova estrutura de agente baseada em um grande modelo de linguagem que integra ferramentas externas para recuperar informações relevantes para a geração eficiente de código no nível da base de código e oferece suporte à interação com artefatos de software para recuperação de informações, navegação de notação de código e teste de código. (3) Código-Código. O código também pode ser usado como entrada para recuperar códigos semelhantes ou relacionados para fornecer referência para a geração do código de destino. Por exemplo, Zhang et al. (2023b) propõe o RepoCoder, uma estrutura simples, genérica e eficaz que usa um processo iterativo de geração de recuperação para recuperar informações em nível de base de código baseadas em similaridade. (4) Código híbrido. Além de usar um único tipo de informação (por exemplo, texto ou código) como entrada para recuperar códigos relevantes, vários tipos de informação podem ser combinados em informações híbridas para melhorar a precisão da recuperação. Por exemplo, Li et al. (2022a) utiliza um modelo avançado de geração de código, aumentando uma consulta de documento com trechos de código gerados pelo modelo de geração (gerando seções ponto a ponto) e, em seguida, usando a consulta aumentada para recuperar o código.ToolCoder Zhang et al. (2023d) Use mecanismos de pesquisa on-line e ferramentas de pesquisa de documentação para obter recomendações apropriadas de API para ajudar na seleção de API e na geração de código. Além disso, a pesquisa não se limita a um único tipo de informação. (5) Código-híbrido. Usa o código como entrada e recupera uma variedade de informações relevantes. Por exemplo, Nashid et al. (2023) propuseram uma nova técnica chamada CEDAR para a criação de alertas que recupera automaticamente apresentações de código relevantes para a tarefa do desenvolvedor, com base na incorporação ou na análise de frequência.2023) Usando um paradigma de aprendizado contextual para gerar anotações de várias intenções para o código, selecionando diferentes exemplos de anotações de código em um conjunto de exemplos. (6) Mistura de texto. Ele usa requisitos como entrada para recuperar códigos relevantes e problemas semelhantes para referência. Por exemplo, Li et al. (2023b) propuseram o LAIL (LLM-Aware In-context Learning), um novo método de seleção baseado em aprendizado para selecionar exemplos a serem usados na geração de códigos.2023c) apresenta um novo mecanismo chamado AceCoder que usa a recuperação de demanda de programas semelhantes como exemplos nos prompts para fornecer uma grande quantidade de conteúdo relevante (por exemplo, algoritmos, APIs).
De acordo com um estudo anterior, Li et al. (2022c); Zhao et al. (2024); Hu et al. (2023a), os métodos de pesquisa existentes podem ser classificados em pesquisa esparsa, pesquisa densa Wang et al. (2024e), e outros métodos Hayati et al. (2018); Zhang et al. (2020); Poesia et al. (2022); Ye et al. (2021); Shu et al. (2022). Fig. 4 mostra o pipeline de recuperação esparsa e densa. O método de recuperação densa transforma a entrada em um vetor de alta dimensão e seleciona as k amostras com a maior similaridade comparando as similaridades semânticas, enquanto o método de recuperação esparsa calcula o BM25 ou métricas como TF-IDF para avaliar a semelhança de texto entre amostras. Além disso, vários métodos alternativos de recuperação foram explorados. Por exemplo, alguns estudos se concentraram no cálculo da distância de edição entre textos em linguagem natural Hayati et al. (2018), ou uma árvore de sintaxe abstrata (AST) de fragmentos de código Zhang et al. (2020); Poesia et al. (2022). Há também métodos que utilizam gráficos de conhecimento para recuperação Ye et al. (2021); Shu et al. (2022).
Os métodos de recuperação densos e esparsos são os dois métodos de recuperação mais dominantes. Desses, as técnicas de recuperação densas geralmente têm um desempenho melhor do que os métodos de recuperação esparsos. No entanto, a recuperação esparsa tende a ser mais eficiente e, em alguns casos, pode alcançar um desempenho comparável ao da recuperação densa. Portanto, muitos estudos optam por usar métodos de recuperação esparsos por motivos de eficiência.
Comportamento de aprendizagem. O comportamento de aprendizagem é o aprendizado contínuo e a atualização do conhecimento por meio do aprendizado e da atualização da memória semântica e processual para melhorar a qualidade e a eficiência do raciocínio e da tomada de decisões. (1) Uso do conhecimento para atualizar a memória semântica. A memória semântica existe principalmente em uma base de conhecimento, armazenando o conhecimento de mundo subjacente, que pode ser atualizado por meio da atualização da base de conhecimento usando o conhecimento de código reconhecido ou construindo uma nova base de conhecimento. Por exemplo, Liao et al. (2023) propôs uma nova estrutura de geração de código, chamada A3-CodGen, para gerar código de maior qualidade utilizando três tipos de informações obtidas de bibliotecas recuperadas (informações localmente conscientes do arquivo de código atual, informações globalmente conscientes de outros arquivos de código e informações de bibliotecas de terceiros).Du et al. (2024) propuseram uma nova técnica de detecção de vulnerabilidade Vul-RAG baseada em modelos de linguagem ampla (LLMs), que extrai conhecimento multidimensional de instâncias de CVE existentes por meio de LLMs para construir uma base de conhecimento de vulnerabilidade. (2) Atualização do conhecimento tácito. Como o conhecimento implícito é armazenado nos parâmetros de um modelo de linguagem grande, os parâmetros do LLM podem ser atualizados por meio do ajuste fino do modelo. Os trabalhos anteriores normalmente constroem novos dados para supervisionar o ajuste fino de modelos pré-treinados, atualizando assim os parâmetros completos dos modelos Xia et al. (2023b); Wei et al. (2023a(matemática) gênerob); Tao et al. (2024); Wang et al. (2024d); Liu et al. (2023a); Wang et al. (2023d); Shi et al. (2023b). No entanto, o custo do ajuste fino do modelo aumenta à medida que o tamanho do parâmetro aumenta. Alguns trabalhos tentaram explorar técnicas de ajuste fino eficientes em termos de parâmetros Weyssow et al. (2023); Shi et al. (2023c). Por exemplo, Weyssow et al. (2023) realizaram um estudo abrangente das técnicas de ajuste fino eficiente de parâmetros (PEFT) para modelos de linguagem grandes para cenários de geração automatizada de código.2023b) inseriu e fez o ajuste fino do adaptador de estrutura com ajuste fino eficiente em vez de fazer o ajuste fino do modelo pré-treinado. A maior parte dos trabalhos atuais usa técnicas eficientes de ajuste fino para ajustar o modelo Guo et al. (2024); Shi et al. (2023d).
(3) Atualização do código do agente. O código do agente refere-se aos programas ou algoritmos que um agente executa para orientar seu comportamento e o processo de tomada de decisões. Os agentes baseados em modelos de linguagem grande fazem isso construindo prompts apropriados como código de agente para regular como perceber o ambiente, fazer raciocínios e tomar decisões e executar operações. Grande parte do trabalho usa técnicas de alinhamento de instruções para alinhar a saída do modelo de linguagem grande com as instruções de entrada. Por exemplo, Muennighoff et al. (2023) aproveita a estrutura natural dos commits do Git para emparelhar alterações de código com instruções humanas e usar essas instruções para fazer ajustes.Hu et al. (2023b) criaram o primeiro conjunto de dados de ajuste de instruções, o InstructCoder, projetado para adaptar grandes modelos de linguagem à edição genérica de códigos. Esses dados de alta qualidade podem trazer novos conhecimentos para modelos de linguagem maiores e atualizar a memória semântica.Zan et al. (2023) realizou experimentos extensos com oito linguagens de programação populares no StarCoder para explorar se as linguagens de programação podem melhorar umas às outras por meio do ajuste de instruções.
2.3.2 Ação externa
Diálogo com humanos/agentes Os agentes podem interagir com humanos ou outros agentes e receber informações valiosas como feedback durante a interação, expandindo o conhecimento do agente e tornando as respostas do Big Language Model mais precisas. Especificamente, muito trabalho tem sido feito usando grandes modelos de linguagem como agentes para interação, por exemplo, Lu et al.2024); Jain et al. (2023); Paul et al. (2023); Shojaee et al. (2023); Liu et al. (2023b); Wang et al. (2023e); Mu et al. (2023); Madaan et al. (2023Jain et al. (2023) propôs o RLCF, que usa feedback de diferentes modelos de linguagem grandes para comparar o código gerado com o código de referência, a fim de treinar ainda mais modelos de linguagem grandes pré-treinados por meio do aprendizado por reforço.REFINER Paul et al. (2023) é uma estrutura para interagir com modelos críticos que fornecem feedback automático.Yang et al. (2023b) examinaram e esclareceram como modelos de linguagem grandes se beneficiam da modelagem discriminativa.2023) construíram um novo conjunto de dados projetado especificamente para reparo de código e o utilizaram para obter um modelo que pudesse gerar automaticamente feedback útil por meio do Preference-Optimised Tuning and Selection.PPOCoder Shojaee et al.2023) consiste em dois componentes, o crítico e o intérprete, e é otimizado usando o PPO por meio da interação entre esses dois modelos.RLTF Liu et al. (2023b) interage com outros modelos que utilizam dados reais e dados em cache on-line gerados por meio da interação com o compilador para calcular as perdas e atualizar os pesos do modelo por meio de feedback gradiente.Wang et al. (2023e) propuseram o ChatCoder, um método para refinar os requisitos por meio de bate-papo com um grande modelo de linguagem.2023a) propôs o Clover, uma ferramenta que verifica a consistência entre código, strings de documentação e comentários formais.ClarifyGPT Mu et al. (2023) solicita que outro grande modelo de linguagem gere perguntas de esclarecimento direcionadas para refinar os requisitos ambíguos da entrada do usuário.Reflexion Shinn et al. (2023) pode interagir com seres humanos e outros agentes para gerar feedback externo.Autodefinição Madaan et al. (2023) usa um único modelo de linguagem grande como gerador, corretor e provedor de feedback sem nenhum dado de treinamento supervisionado, treinamento adicional ou aprendizado por reforço.Repilot Wei et al. (2023c) sintetiza patches candidatos por meio da interação entre o Big Language Model e o Completion Engine. Especificamente, o Repilot remove os tokens inviáveis com base nas sugestões fornecidas pelo Big Language Model.Wang et al. (2023c) introduziram o MINT, um teste de referência que pode avaliar a capacidade de um modelo de linguagem grande para resolver tarefas interativas de várias rodadas usando o feedback de linguagem natural de usuários simulados com o GPT-4. Hong et al. (2023b) propuseram o MetaGPT, uma estrutura inovadora de metaprogramação que incorpora fluxos de trabalho humanos eficientes à colaboração multiagente com base em um modelo de linguagem amplo.Huang et al. (2023a) apresentaram o AgentCoder, uma nova solução de geração de código que inclui uma estrutura multiagente com agentes especializados: um agente programador, um agente projetista de testes e um agente de execução de testes.
O ambiente digital Os agentes podem interagir com sistemas digitais, como a plataforma OJ, páginas da Web, compiladores e outras ferramentas externas, e as informações obtidas durante a interação podem ser usadas como feedback para otimização. Especificamente, os compiladores são as ferramentas externas mais comuns, como Jain et al (2023); Shojaee et al. (2023); Liu et al. (2023b); Wang et al. (2022); Zhang et al.2023e). Por exemplo, RLCF Jain et al. (2023) verifica se o código que ele gera passa por um conjunto de verificações de correção treinando um modelo de linguagem grande pré-treinado usando feedback derivado do compilador.PPOCoder Shojaee et al. (2023) pode incorporar o feedback do compilador e o alinhamento estrutural como conhecimento adicional para a otimização do modelo, a fim de ajustar o modelo de geração de código por meio do aprendizado por reforço profundo (RL).RLTF Liu et al. (2023b) interage com o compilador para gerar pares de dados de treinamento e os armazena em um cache on-line.Wang et al. (2022) propôs o COMPCODER, que usa o feedback do compilador para a geração de códigos compiláveis.2023e) propuseram o Self-Edit, uma abordagem de geração e edição para melhorar a qualidade do código em tarefas de programação competitivas usando os resultados da execução do código gerado a partir de um grande modelo de linguagem. Além disso, muitos trabalhos criaram ferramentas, como mecanismos de pesquisa, mecanismos de complementação etc., para ampliar os recursos dos agentes inteligentes.2024a); Zhang et al.2024); Agrawal et al. (2023); Wei et al.2023c); Zhang et al.2023fWang et al. (2024a) introduziram o TOOLGEN, um método para integrar ferramentas de autocompletar no processo de geração de modelos de linguagem grande do código para tratar de erros de dependência, como variáveis indefinidas e membros ausentes.Zhang et al. (2024) apresentaram o CodeAgent, uma nova estrutura de agentes para modelagem de linguagens grandes que integra cinco ferramentas de programação para permitir a interação com a documentação do software para obter informações, navegação de símbolos de código e teste de código para a geração eficaz de código em nível de repositório.Agrawal et al.2023) propuseram o MGD, um método de decodificação guiado por monitor no qual o monitor usa análise estática para guiar a decodificação.Repilot Wei et al. (2023c) sintetiza patches candidatos por meio da interação entre o Big Language Model e o Completion Engine. Especificamente, o Repilot completa o Token com base nas sugestões fornecidas pelo Completion Engine.
3 Desafios e oportunidades
Depois de analisar o conteúdo relacionado ao trabalho sobre agentes baseados em modelos de linguagem grande (LLM) na engenharia de software, fica evidente que a integração desses dois domínios ainda enfrenta muitos desafios, o que limita seu desenvolvimento. Nesta seção, discutimos em detalhes os desafios atuais enfrentados pelos agentes baseados em LLM na engenharia de software e discutimos as oportunidades de trabalho futuro com base na análise dos desafios existentes.
3.1 Exploração insuficiente dos módulos sensoriais
Por exemplo, nº 1 2.1 Conforme descrito na seção, não há exploração suficiente de agentes baseados em LLM para módulos perceptuais na engenharia de software. Diferentemente da linguagem natural, o código é um tipo especial de representação que pode ser tratado como texto comum ou convertido em representações intermediárias com recursos de código, como árvores de sintaxe abstrata (ASTs), gráficos de fluxo de controle (CFGs) etc. Trabalhos existentes, como o de Ahmed et al. (2024); Al-Kaswan et al. (2023); Arakelyan et al. (2023); Beurer-Kellner et al. (2023); Alqarni e Azim (2022) o código é normalmente considerado como texto e ainda faltam pesquisas que explorem modalidades de entrada baseadas em árvores/gráficos em agentes baseados em LLM que trabalham com engenharia de software. Além disso, as modalidades de entrada visual e auditiva também ainda são pouco exploradas.
3.2 Habilidades de interpretação de papéis
Os agentes baseados em LLM geralmente precisam desempenhar diferentes funções em uma variedade de tarefas, cada uma exigindo habilidades específicas. Por exemplo, um agente pode precisar atuar como um gerador de código quando for solicitado a gerar código e como um testador de código quando estiver realizando testes de código. Além disso, em alguns cenários, esses agentes podem precisar ter mais de um recurso ao mesmo tempo. Por exemplo, em cenários de geração de código, o agente precisa atuar como gerador e testador de código e, portanto, precisa ter a capacidade de gerar e testar código (Huang et al. 2023b). No domínio da engenharia de software, há muitas tarefas de nicho para as quais o aprendizado de LLM não é suficiente, além de tarefas complexas que exigem que os agentes tenham vários recursos, como cenários de geração de testes, desenvolvimento de front-end e solução de problemas em nível de repositório. Assim, o avanço da pesquisa sobre como permitir que os agentes adotem efetivamente novas funções e gerenciem as demandas de desempenho de várias funções representa uma direção promissora para trabalhos futuros.
3.3 Base de recuperação de conhecimento inadequada
As bases de recuperação de conhecimento externo são uma parte importante da memória semântica no módulo de memória do agente e uma ferramenta externa importante com a qual os agentes podem interagir. No campo do processamento de linguagem natural (NLP), há bases de conhecimento como a Wikipedia como bases de recuperação externas (Zhao et al. 2023). Entretanto, no campo da engenharia de software, não há uma base de conhecimento autorizada e reconhecida que contenha uma grande quantidade de conhecimentos relacionados a códigos, como a sintaxe básica de várias linguagens de programação, algoritmos comumente usados, conhecimentos relacionados a estruturas de dados e sistemas operacionais. Em pesquisas futuras, pode-se tentar desenvolver uma base de conhecimento de código abrangente que possa ser usada como base para a recuperação externa de agentes. Essa base de conhecimento enriquecerá as informações disponíveis, melhorando assim a qualidade e a eficiência do processo de raciocínio e tomada de decisões.
3.4 Fenômenos ilusórios em agentes baseados em LLM
Muitos estudos relacionados a agentes baseados em LLM consideram o LLM como o núcleo cognitivo do agente, e o desempenho geral do agente está intimamente relacionado aos recursos do LLM subjacente. Os estudos existentes (Pan et al. 2024; Liu et al. 2024a) sugere que os agentes baseados em LLM podem criar alucinações, como a geração de APIs inexistentes durante a realização de tarefas de engenharia de software. Ao mesmo tempo, a otimização do agente também pode atenuar inversamente as alucinações dos agentes baseados em LLM, destacando uma relação bidirecional entre o desempenho do agente e a atenuação das alucinações. Embora vários estudos tenham explorado o fenômeno das alucinações em LLM, ainda há desafios significativos na abordagem das alucinações em agentes baseados em LLM. Explorar os tipos de alucinações presentes em agentes baseados em LLM, analisar as causas dessas alucinações em profundidade e propor métodos eficazes para o alívio de alucinações são oportunidades importantes para pesquisas futuras.
3.5 Eficiência da colaboração de inteligência múltipla
Na colaboração de várias inteligências, cada inteligência individual deve desempenhar uma função diferente para cumprir uma tarefa específica e, em seguida, os resultados das decisões de cada inteligência são combinados para atingir metas mais complexas em conjunto.2023b); Hong et al. (2023a); Huang et al. (2023b); Wang et al. (2023a). No entanto, esse processo geralmente requer uma grande quantidade de recursos de computação para cada inteligência, o que leva ao desperdício de recursos e à redução da eficiência. Além disso, cada inteligência individual precisa sincronizar e compartilhar várias informações, o que aumenta os custos de comunicação e afeta o tempo real e a capacidade de resposta da colaboração. O gerenciamento e a alocação eficientes dos recursos computacionais, a minimização do custo de comunicação entre as inteligências e a redução da sobrecarga de raciocínio das inteligências individuais são os principais desafios para melhorar a eficiência da colaboração entre várias inteligências. A abordagem desses problemas oferece oportunidades significativas para pesquisas futuras.
3.6 Aplicação de técnicas de engenharia de software à Intelligentsia com base em grandes modelos de linguagem
As tecnologias no campo da engenharia de software, especialmente a codificação, têm o potencial de avançar significativamente no campo da inteligência, sugerindo uma relação mutuamente benéfica entre os dois campos. Por exemplo, as técnicas de teste de software podem ser adaptadas para identificar comportamentos anômalos e possíveis defeitos na inteligência com base em grandes modelos de linguagem. Além disso, os aprimoramentos nas ferramentas de software (por exemplo, APIs e bibliotecas) também podem melhorar o desempenho da inteligência com base em modelos de linguagem grandes, especialmente para a inteligência com recursos de uso de ferramentas. Além disso, as técnicas de gerenciamento de pacotes podem ser adaptadas para gerenciar com eficácia o sistema de corpo inteligente. Por exemplo, o controle de versão pode ser aplicado para monitorar e coordenar atualizações de diferentes inteligências em um sistema de corpo inteligente, melhorando a compatibilidade e a integridade do sistema.
No entanto, as pesquisas nessa área continuam limitadas. Portanto, explorar a incorporação de técnicas de SE mais complexas em sistemas corporais inteligentes representa uma direção promissora para pesquisas futuras que podem impulsionar o progresso em ambas as áreas.
4 Conclusão
A fim de analisar em profundidade o trabalho sobre a combinação de grandes inteligências baseadas em modelos de linguagem com a engenharia de software, primeiro coletamos muitos estudos sobre a combinação de grandes inteligências baseadas em modelos de linguagem com tarefas no campo da engenharia de software. Em seguida, após reunir e analisar os estudos obtidos durante o período de coleta de dados, apresentamos uma estrutura para a inteligência baseada em grandes modelos de linguagem na engenharia de software que contém três módulos principais: percepção, memória e ação. Por fim, apresentamos informações detalhadas sobre cada módulo da estrutura, analisamos os desafios atuais enfrentados pela inteligência baseada em modelos de linguagem ampla na engenharia de software e apontamos algumas oportunidades para trabalhos futuros.