AI Agent est actuellement un domaine brûlant. Dans un long article [1] écrit par LilianWeng, directrice de recherche sur les applications OpenAI, elle a proposé le concept d'Agent = LLM + mémoire + compétences en planification + utilisation des outils
Figure 1 Présentation d'un système d'agent autonome alimenté par LLM
Le rôle de l'agent est d'utiliser la puissante compréhension du langage et les capacités de raisonnement logique de LLM pour appeler des outils permettant d'aider les humains à accomplir des tâches. Cependant, cela pose également certains défis. Par exemple, la capacité du modèle de base détermine l'efficacité des outils d'appel d'agent, mais le modèle de base lui-même présente des problèmes tels que l'illusion du grand modèle
Cet article commence par "Saisir une pièce". d'instructions pour diviser automatiquement les tâches complexes et l'appel de fonction" comme exemple pour construire le processus d'agent de base, et se concentrer sur l'explication de la façon de construire avec succès les modules "répartition des tâches" et "appel de fonction" via la "sélection de modèle de base", "Invite conception", etc.
Le contenu réécrit est : Adresse :
https://sota.jiqizhixin.com/project/smart_agent
GitHub Repo :
besoin de lourd le contenu écrit est : https://github.com/zzlgreat/smart_agent
Pour la mise en œuvre de "Saisir une commande pour implémenter automatiquement le fractionnement de tâches complexes et l'appel de fonctions", le projet Le processus de l'agent construit est le suivant :
Figure 1 "ReWOO : Découplage du raisonnement des observations pour des modèles de langage augmentés efficaces"
Afin de réaliser le processus ci-dessus, dans les modules "Task Splitting" et "Function Calling", le projet a été conçu séparément Deux modèles affinés pour permettre la possibilité de diviser des tâches complexes et d'appeler des fonctions personnalisées à la demande. Le solveur de modèle résumé peut être le même que le modèle de tâche fractionnée
Dans le module "Répartition des tâches", grands modèles Nécessite la capacité de diviser des tâches complexes en tâches plus simples. Le succès du « répartition des tâches » dépend principalement de deux facteurs :
Dans le même temps, nous espérons que le format de sortie du modèle de répartition des tâches sous un modèle d'invite donné pourra être aussi relativement fixe que possible, mais il ne sera pas surajusté et ne perdra pas les capacités de raisonnement et de généralisation d'origine du model. Ici, nous utilisons lora pour affiner la couche qv, en apportant le moins de modifications structurelles possible au modèle d'origine.
Dans le module « Function Call », les grands modèles doivent avoir la capacité d'appeler des outils de manière stable pour s'adapter aux exigences des tâches de traitement :
De plus, en termes d'utilisation de la puissance de calcul, le réglage fin et l'inférence de grands modèles de langage dans des conditions de faible puissance de calcul sont obtenus grâce au réglage fin de lora/qlora, et un déploiement quantitatif est adopté pour abaisser davantage le seuil. pour inférence.
Pour la sélection du modèle de « répartition des tâches », nous espérons que le modèle possède de fortes capacités de généralisation et certaines capacités de chaîne de réflexion. À cet égard, nous pouvons nous référer au classement Open LLM sur HuggingFace pour sélectionner les modèles. Nous sommes plus préoccupés par le test MMLU et le score global Moyenne qui mesure la précision multitâche du modèle de texte
. doit être réécrit Le contenu est : Figure 2 Classement LLM ouvert HuggingFace (0921)
Le modèle de répartition des tâches sélectionné pour ce projet est :
Pour sélectionner le modèle "appel de fonction", les données de formation originales de la version open source Llama2 de Meta du modèle de programmation CodeLlama contiennent une grande quantité de données de code, vous pouvez donc essayer d'utiliser qlora pour un script personnalisé finement. réglage. Pour le modèle d'appel de fonction, choisissez le modèle CodeLlama (34b/13b/7b est acceptable) comme référence
Ce projet a choisi le modèle de modèle d'appel de fonction :
Afin d'affiner le modèle « d'appel de fonction », ce projet utilise la méthode d'entraînement au masque de perte rapide pour stabiliser la sortie du modèle. Voici comment la fonction de perte est ajustée :
En termes de répartition des tâches, ce projet utilise le format d'invite conçu par le planificateur dans le cadre de raisonnement efficace de grand modèle de langage ReWOO (Reasoning WithOut Observation). Remplacez simplement les fonctions telles que « Wikipédia[input] » par les fonctions et descriptions correspondantes. Voici un exemple d'invite :
For the following tasks, make plans that can solve the problem step-by-step. For each plan, indicate which external tool together with tool input to retrieve evidence. You can store the evidence into a variable #E that can be called by later tools. (Plan, #E1, Plan, #E2, Plan, ...) Tools can be one of the following: Wikipedia[input]: Worker that search for similar page contents from Wikipedia. Useful when you need to get holistic knowledge about people, places, companies, historical events, or other subjects.The response are long and might contain some irrelevant information. Input should be a search query. LLM[input]: A pretrained LLM like yourself. Useful when you need to act with general world knowledge and common sense. Prioritize it when you are confident in solving the problem yourself. Input can be any instruction.
Pour les appels de fonction, car le réglage fin de qlora sera effectué plus tard, les fonctions open source sur huggingface. sont directement utilisés Appelez le style d'invite dans l'ensemble de données [3]. Voir ci-dessous.
在Ubuntu 22.04系统上,使用了CUDA 11.8和Pytorch 2.0.1,并采用了LLaMA-Efficient-Tuning框架。此外,还使用了Deepspeed 0.10.4
需要进行针对 Marcoroni-70B 的 lora 微调
全部选择完成后,新建一个训练的 bash 脚本,内容如下:
accelerate launch src/train_bash.py \--stage sft \--model_name_or_path your_model_path \--do_train \--dataset rewoo \--template alpaca \--finetuning_type lora \--lora_target q_proj,v_proj \--output_dir your_output_path \--overwrite_cache \--per_device_train_batch_size 1 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 1000 \--learning_rate 5e-6 \--num_train_epochs 4.0 \--plot_loss \--flash_attn \--bf16
这样的设置需要的内存峰值最高可以到 240G,但还是保证了 6 卡 4090 可以进行训练。开始的时候可能会比较久,这是因为 deepspeed 需要对模型进行 init。之后训练就开始了。
需要重新写的内容是:图4 6 卡 4090 训练带宽速度
共计用时 8:56 小时。本次训练中因为主板上的 NVME 插槽会和 OCULINK 共享一路 PCIE4.0 x16 带宽。所以 6 张中的其中两张跑在了 pcie4.0 X4 上,从上图就可以看出 RX 和 TX 都只是 PCIE4.0 X4 的带宽速度。这也成为了本次训练中最大的通讯瓶颈。如果全部的卡都跑在 pcie 4.0 x16 上,速度应该是比现在快不少的。
需要进行改写的内容是:图5展示了LLaMA-Efficient-Tuning生成的损失曲线
以上是 LLaMA-Efficient-Tuning 自动生成的 loss 曲线,可以看到 4 个 epoch 后收敛效果还是不错的。
2)针对 codellama 的 qlora 微调
根据前文所述的 prompt loss mask 方法,我们对 trainer 类进行了重构(请参考项目代码仓库中的 func_caller_train.py)。由于数据集本身较小(共55行),所以仅需两分钟即可完成4个epoch的训练,模型迅速收敛
在项目代码仓库中,提供了一个简短可用的 toolkit 示例。里面的函数包括:
现在有一个70B和一个34B的模型,在实际使用中,用6张4090同时以bf16精度运行这两个模型是不现实的。但是可以通过量化的方法压缩模型大小,同时提升模型推理速度。这里采用高性能LLM推理库exllamav2运用flash_attention特性来对模型进行量化并推理。在项目页面中作者介绍了一种独特的量化方式,本文不做赘述。按照其中的转换机制可以将70B的模型按照2.5-bit量化为22G的大小,这样一张显卡就可以轻松加载
需要重新编写的内容是:1)测试方法
Étant donné une description de tâche complexe qui ne figure pas dans l'ensemble de formation, ajoutez à la boîte à outils les fonctions et les descriptions correspondantes qui ne sont pas incluses dans l'ensemble de formation. Si le planificateur peut terminer la répartition des tâches, le distributeur peut appeler la fonction et le solveur peut résumer les résultats sur la base de l'ensemble du processus.
Le contenu qui doit être réécrit est : 2) Résultats des tests
Répartition des tâches : utilisez d'abord la génération de texte-webui pour tester rapidement l'effet du modèle de répartition des tâches, comme le montre la figure ci-dessous :
Figure 6 Résultats du test de répartition des tâches
Ici, vous pouvez écrire une interface restful_api simple pour faciliter l'appel dans l'environnement de test de l'agent (voir le code du projet fllama_api.py).
Appel de fonction : Une logique simple planificateur-distributeur-travailleur-solveur a été écrite dans le projet. Testons ensuite cette tâche. Entrez une commande : quels films le réalisateur de "Killers of the Flower Moon" a-t-il réalisé ? Listez-en un et recherchez-le dans bilibili.
「Rechercher bilibili」Cette fonction n'est pas incluse dans l'ensemble de formation aux appels de fonction du projet. Dans le même temps, ce film est également un nouveau film qui n'est pas encore sorti. Il n'est pas sûr que les données d'entraînement du modèle lui-même soient incluses. Vous pouvez voir que le modèle divise très bien les instructions de saisie :
sur bilibili et en appelant la fonction en même temps, vous avez obtenu les résultats suivants : Le résultat cliqué est Les Affranchis, qui correspond au réalisateur du film.
Ce projet prend comme exemple le scénario de « saisie d'une commande pour réaliser automatiquement un fractionnement de tâches complexe et un appel de fonction », et conçoit un processus d'agent de base : boîte à outils-plan-distribute-worker-solver pour mettre en œuvre un agent capable d'effectuer des tâches complexes de base qui ne peuvent pas être réalisées en une seule étape. Grâce à la sélection de modèles de base et au réglage fin de Lora, le réglage fin et l'inférence de grands modèles peuvent être effectués dans des conditions de faible puissance de calcul. Et adopter une méthode de déploiement quantitative pour abaisser encore le seuil de raisonnement. Enfin, un exemple de recherche d’autres œuvres d’un réalisateur a été mis en œuvre via ce pipeline, et des tâches complexes de base ont été réalisées.
Limitations : cet article conçoit uniquement les appels de fonctions et le fractionnement des tâches en fonction de la boîte à outils pour la recherche et les opérations de base. L'ensemble d'outils utilisé est très simple et n'a pas beaucoup de design. Il n'y a pas beaucoup de considération pour le mécanisme de tolérance aux pannes. Grâce à ce projet, chacun peut continuer à explorer les applications dans le domaine de la RPA, améliorer encore le processus des agents et atteindre un degré plus élevé d'automatisation intelligente pour améliorer la gérabilité du processus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!