Ubuntu TechHive
introduction-to-natural-language-processing.md
自然语言处理导论
article.细节

自然语言处理导论

reading.进展 16 分钟阅读数

自然语言处理导论简介

自然语言处理入门

自然语言处理中的 RAG 开发与文本生成

课程概述:

中文

  • 自然语言处理 (NLP) 简介及其在文本生成中的应用。
  • 检索增强生成 (RAG) 探索。
  • RAG 开发的实践经验,以及在创意写作、内容生成等领域的实际应用。
  • 文本生成应用程序的实现。
  • 分类

    • 摘要
    • 翻译
  • 技术栈包括

Français

  • Introduction au traitement du langage naturel (NLP) et à ses applications dans la génération de texte.
  • Exploration de la génération augmentée par récupération (RAG).
  • Expérience pratique avec le développement RAG et applications pratiques dans l'écriture créative, la génération de contenu, et plus encore.
  • Mise en œuvre d'une application de génération de texte avec.
  • Classification

    • Résumé
    • Traduction
  • La pile technologique comprend

目标

中文

  • 理解自然语言处理 (NLP) 的基础知识及其在各种应用(特别是文本生成)中的重要性。
  • 熟悉检索增强生成 (RAG) 技术,并理解它们如何增强文本生成任务。
  • 展示构建文本生成应用程序的能力,包括分类、摘要、文本生成以及用于无缝交互的用户友好型图形用户界面 (GUI)。
  • 掌握 RAG 开发原型所需的技术栈,包括 Transformers、向量数据库(如 FAISS)、Python 编程语言、LangChain 和 Streamlit 框架。

Français

  • Comprendre les fondamentaux du traitement du langage naturel (NLP) et son importance dans diverses applications, particulièrement dans la génération de texte.
  • Se familiariser avec les techniques de génération augmentée par récupération (RAG) et comprendre comment elles améliorent les tâches de génération de texte.
  • Démontrer la capacité à construire une application de génération de texte incorporant la classification, la résumé, la génération de texte, et une interface graphique utilisateur (GUI) conviviale pour une interaction fluide.
  • Maîtriser la pile technologique requise pour le prototypage du développement RAG, incluant les Transformers, les bases de données de vecteurs (par exemple, FAISS), le langage de programmation Python, LangChain, et le framework Streamlit.

什么是 Transformer?

flowchart TD
    A(INPUT) -->|Tokenized & Embedded| B
    B -->|N=6 Layers| C[Encoder Stack]
    C -->|Positional Encoding| D
    D -->|Multi-Head Self-Attention| E
    E -->|Add & Norm| F
    F -->|Feed Forward| G
    G -->|Add & Norm| H[Encoder Output]
    H -->|Passed to Decoder| I[Decoder Stack]
    I -->|Positional Encoding| J
    J -->|Multi-Head Self-Attention| K
    K -->|Add & Norm| L
    L -->|Multi-Head Attention over Encoder Output| M
    M -->|Add & Norm| N
    N -->|Feed Forward| O
    O -->|Add & Norm| P[Decoder Output]
    P --> Q[Linear]
    Q --> R[Softmax]
    R --> S(OUTPUT)

    subgraph ENCODER [Encoder]
    B --> C
    end

    subgraph DECODER [Decoder]
    I --> P
    end

    style ENCODER fill:#f9f,stroke:#333,stroke-width:2px
    style DECODER fill:#bbf,stroke:#333,stroke-width:2px

中文

Transformer 擅长理解提示词。Transformer 架构由 Vaswani 等人在其原始论文 "Attention Is All You Need"中引入的各种组件组成。 这些组件包括:

  • 相同层的堆叠: 编码器由 N = 6 个相同的层堆叠而成。每一层对输入数据执行一系列操作。
  • 子层: 编码器中的每一层都有两个子层:

    • 多头自注意力机制: 第一个子层对输入数据应用多头自注意力机制。该机制允许模型在编码每个单词的表示时,权衡输入序列中不同单词的重要性。
    • 前馈网络: 第二个子层是一个简单的、位置全连接的前馈网络。它对序列中的每个位置独立应用线性变换,随后是(通常为 ReLU 的)非线性激活函数。
  • 残差连接: 在两个子层的每一层周围都采用了残差连接(也称为跳跃连接)。这意味着每个子层的输入在通过层归一化步骤之前会先与其输出相加。这有助于缓解训练过程中的梯度消失问题,并促进信息在网络中的流动。
  • 层归一化: 在残差连接之后,应用层归一化。层归一化对特征维度上每一层的激活值进行归一化,有助于稳定训练过程。
  • 维度: 为了促进残差连接,模型中的所有子层以及嵌入层产生的输出维度均为 d_model = 512. 这意味着每个子层和嵌入层的输出维度为 /_512_/,这是模型的一个超参数。

解码器: 解码器同样由 N = 6 个相同的层堆叠而成。除了每个编码器层中的两个子层外,解码器还插入了第三个子层,该子层对编码器堆栈的输出执行多头注意力机制。与编码器类似,我们在每个子层周围采用残差连接,随后进行层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注到后续位置。这种掩码机制,加上输出嵌入向后偏移一个位置的事实,确保了位置 i 的预测只能依赖于位置小于 i 的已知输出。

Français

Le Transformateur est doué pour comprendre les instructions. L'architecture du transformateur se compose de différents composants introduits dans l'article original "L'attention, c'est tout ce dont vous avez besoin" par Vaswani et al. Les composants incluent :

  • Pile de couches identiques : L'encodeur est constitué d'une pile de N = 6 couches identiques. Chaque couche effectue une série d'opérations sur les données d'entrée.
  • Sous-couches : Chaque couche de l'encodeur a deux sous-couches :

    • Mécanisme d'auto-attention multi-têtes : La première sous-couche applique un mécanisme d'auto-attention multi-têtes aux données d'entrée. Ce mécanisme permet au modèle de peser l'importance des différents mots dans la séquence d'entrée lors de l'encodage de la représentation de chaque mot.
    • Réseau de neurones feed-forward : La deuxième sous-couche est un réseau de neurones feed-forward entièrement connecté et positionnel. Il applique une transformation linéaire suivie d'une fonction d'activation non linéaire (typiquement ReLU) indépendamment à chaque position dans la séquence.
  • Connexions résiduelles : Une connexion résiduelle, également connue sous le nom de connexion de saut, est employée autour de chacune des deux sous-couches. Cela signifie que l'entrée de chaque sous-couche est ajoutée à sa sortie avant de passer par l'étape de normalisation de couche. Cela aide à atténuer le problème de disparition de gradient pendant l'entraînement et facilite le flux d'informations à travers le réseau.
  • Normalisation de couche : Après la connexion résiduelle, une normalisation de couche est appliquée. La normalisation de couche normalise les activations de chaque couche à travers la dimension des caractéristiques, aidant à stabiliser le processus d'entraînement.
  • Dimensionnalité : Pour faciliter les connexions résiduelles, toutes les sous-couches du modèle, ainsi que les couches d'embedding, produisent des sorties de dimension d_model = 512. Cela signifie que la dimensionnalité de sortie de chaque sous-couche et des couches d'embedding est de 512, qui est un hyperparamètre du modèle.

Décodeur : Le décodeur est également composé d'une pile de N = 6 couches identiques. En plus des deux sous-couches dans chaque couche d'encodeur, le décodeur insère une troisième sous-couche, qui effectue une attention multi-têtes sur la sortie de la pile d'encodeur. De manière similaire à l'encodeur, nous employons des connexions résiduelles autour de chacune des sous-couches, suivies par une normalisation de couche. Nous modifions également la sous-couche d'auto-attention dans la pile de décodeur pour empêcher les positions d'assister aux positions ultérieures. Ce masquage, combiné au fait que les embeddings de sortie sont décalés d'une position, assure que les prédictions pour la position i peuvent dépendre uniquement des sorties connues aux positions inférieures à i.

flowchart TB
    subgraph encoder [Encoder]
        direction TB
        enc_input(Input Embedding) --> enc_pos(Positional Encoding)
        enc_pos --> enc_Nx1[Multi-Head Attention]
        enc_Nx1 --> enc_addnorm1[Add & Norm]
        enc_addnorm1 --> enc_ff1[Feed Forward]
        enc_ff1 --> enc_addnorm2[Add & Norm]
        enc_addnorm2 -.-> enc_Nx2[Multi-Head Attention]
        enc_Nx2 -.-> enc_addnorm3[Add & Norm]
        enc_addnorm3 -.-> enc_ff2[Feed Forward]
        enc_ff2 -.-> enc_addnorm4[Add & Norm]
        enc_addnorm4 -.-> enc_NxN[...]
        enc_NxN -.-> enc_output[Encoder Output]
    end

    subgraph decoder [Decoder]
        direction TB
        dec_input(Output Embedding) --> dec_pos(Positional Encoding)
        dec_pos --> dec_Nx1[Masked Multi-Head Attention]
        dec_Nx1 --> dec_addnorm1[Add & Norm]
        dec_addnorm1 --> dec_ff1[Feed Forward]
        dec_ff1 --> dec_addnorm2[Add & Norm]
        dec_addnorm2 -.-> dec_Nx2[Masked Multi-Head Attention]
        dec_Nx2 -.-> dec_addnorm3[Add & Norm]
        dec_addnorm3 -.-> dec_ff2[Feed Forward]
        dec_ff2 -.-> dec_addnorm4[Add & Norm]
        dec_addnorm4 -.-> dec_NxN[...]
        dec_NxN -.-> dec_output[Decoder Output]
    end

    enc_output --> dec_input
    dec_output --> lin[Linear]
    lin --> softmax[Softmax]
    softmax --> out(Output Probabilities)

    %% Styling
    classDef addnorm fill:#FFDD6B,stroke:#333,stroke-width:2px;
    class enc_addnorm1,enc_addnorm2,enc_addnorm3,enc_addnorm4,dec_addnorm1,dec_addnorm2,dec_addnorm3,dec_addnorm4 addnorm;
    classDef feedforward fill:#6BCB77,stroke:#333,stroke-width:2px;
    class enc_ff1,enc_ff2,dec_ff1,dec_ff2 feedforward;
    classDef attention fill:#4D96FF,stroke:#333,stroke-width:2px;
    class enc_Nx1,dec_Nx1,dec_Nx2 attention;
    classDef embedding fill:#FFAFCC,stroke:#333,stroke-width:2px;
    class enc_input,dec_input embedding;
    classDef softmaxlinear fill:#DB6E6E,stroke:#333,stroke-width:2px;
    class lin,softmax softmaxlinear;
    classDef output fill:#FFFFFF,stroke:#333,stroke-width:2px;
    class out output;

自注意力机制

中文

  • 想象一下你在阅读一个句子,并希望理解每个单词与整个句子之间的关系。自注意力机制允许模型在处理每个单词时关注输入序列的不同部分,这类似于你在阅读时可能会注意不同的单词。

Français

  • Imaginez que vous lisiez une phrase et que vous vouliez comprendre la signification de chaque mot par rapport à la phrase entière. L'auto-attention permet au modèle de se concentrer sur différentes parties de la séquence d'entrée lors du traitement de chaque mot, un peu comme vous pourriez faire attention à différents mots en lisant.

编码器-解码器

中文

  • Transformer 通常由两部分组成:编码器和解码器。编码器处理输入数据(例如一种语言的句子),而解码器生成输出(例如翻译成另一种语言的句子)。

Français

  • Les transformateurs sont généralement composés de deux parties principales : un encodeur et un décodeur. L'encodeur traite les données d'entrée, comme une phrase dans une langue, tandis que le décodeur génère la sortie, comme la phrase traduite dans une autre langue.

多头注意力

中文

  • 该组件允许模型联合关注来自不同位置的不同表示子空间的信息。这就像有多个专家从不同角度审视输入数据,并结合他们的见解来做出更明智的决策。

Français

  • Ce composant permet au modèle de prêter attention conjointement à des informations provenant de différents sous-espaces de représentation à différentes positions. C'est comme si on avait plusieurs experts qui regardent différents aspects des données d'entrée et combinent leurs aperçus pour prendre une décision plus éclairée.

位置编码

中文

  • 与传统的循环神经网络 (RNNs) 不同,后者天生理解输入序列的顺序,而 Transformer 没有这种内置的理解能力。位置编码是一种将每个单词的位置信息注入模型的方法,帮助它理解数据的序列性质。

Français

  • Contrairement aux réseaux neuronaux récurrents traditionnels (RNNs), qui comprennent intrinsèquement l'ordre des séquences d'entrée, les transformateurs n'ont pas cette compréhension intégrée. L'encodage positionnel est une façon d'injecter des informations sur la position de chaque mot dans le modèle, l'aidant à comprendre la nature séquentielle des données.

前馈神经网络

中文

  • 在使用自注意力机制处理输入序列后,Transformer 通常使用前馈神经网络在将表示传递到下一层之前进一步转换输入数据的表示。
  • 优点:

    • 实现并行化
    • 捕捉长距离含义

Français

  • Après avoir traité la séquence d'entrée avec des mécanismes d'auto-attention, les transformateurs utilisent généralement des réseaux neuronaux avance rapide pour transformer davantage les représentations des données d'entrée avant de les passer à la couche suivante.
  • Avantages :

    • Permet la parallélisation
    • Compréhension de sens à longue portée

分词器 (Tokenizer)

中文

  • **分词器**是自然语言处理 (NLP)中的一个基本组件,它将文本分解为更小的单元(通常是单词或子词),称为 token。这些 token 是 NLP 模型进行进一步分析的基本构建块。
  • 单词分词器: 根据空格或标点符号将文本拆分为单个单词。
  • 子词分词器: 将单词分解为更小的有意义单元,例如前缀、后缀或词根。
  • 字符分词器: 将文本分解为单个字符。这种方法在处理具有复杂形态的语言或处理文本生成等任务时非常有用,因为字符级表示可能更合适。

开发基础模型的公司:

  • OpenAI, Google, Meta, Microsoft, Amazon, IBM 等

模型:

用例:

  • 语义分析
  • 翻译
  • 摘要
  • 聊天机器人

Français

  • Un tokeniseur est un composant fondamental dans le traitement du langage naturel (NLP) qui décompose le texte en unités plus petites, typiquement des mots ou des sous-mots, appelés tokens. Ces tokens servent de blocs de construction de base pour l'analyse ultérieure par les modèles de NLP.
  • Tokeniseurs de mots : Ces tokeniseurs décomposent le texte en mots individuels en se basant sur les espaces ou les signes de ponctuation.
  • Tokeniseur de sous-mots : La tokenisation de sous-mots décompose les mots en unités signifiantes plus petites, telles que les préfixes, les suffixes ou les racines.
  • Tokeniseurs de caractères : La tokenisation au niveau des caractères décompose le texte en caractères individuels. Cette approche est utile lorsqu'on traite des langues à morphologie complexe ou lorsqu'on gère des tâches comme la génération de texte, où les représentations au niveau des caractères peuvent être plus appropriées.

Entreprises développant des modèles de fondation :

  • OpenAI, Google, Meta, Microsoft, Amazon, IBM etc

Modèles :

Cas d'utilisation :

  • Analyse sémantique
  • Traduction
  • Résumé
  • ChatBot

演示

  • NLP - 分类 / 翻译 / 摘要
  • 代码 (NLP/app.py):
import streamlit as st
from transformers import pipeline
from transformers import AutoTokenizer, T5Tokenizer
from transformers import T5ForConditionalGeneration

## Sentiment-Analysis/Classification
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")

## Translation from English to German
model_name = "google/flan-t5-large"
flan_tokenizer = T5Tokenizer.from_pretrained(model_name)
flan_model = T5ForConditionalGeneration.from_pretrained(model_name)

## Summarization
bart_model_name = "facebook/bart-large-cnn"
summarizer = pipeline("summarization", model=bart_model_name)


# Function to classify sequence
def classify_text(sequence_to_classify, candidate_labels):
    results = classifier(sequence_to_classify, candidate_labels)
    max_value, max_index = max(
        (value, index) for index, value in enumerate(results["scores"])
    )
    st.write(((results["labels"])[max_index]).upper())


# Function to Translate text
def generate_text(prompt_text):
    text_embeddings = flan_tokenizer(
        "Translate text from English to German: " + prompt_text, return_tensors="pt"
    ).input_ids
    model_output = flan_model.generate(text_embeddings, max_new_tokens=50)
    # Decode and print response
    del_response = flan_tokenizer.decode(model_output[0], skip_special_tokens=True)
    st.write(del_response)


# Function to summarize text
def summarize_text(prompt_text):
    st.write(
        summarizer(prompt_text, max_length=130, min_length=30, do_sample=False)[0][
            "summary_text"
        ]
    )


## add in casual language modeling include prompt engineering + finetuning


# Function to start chatbot
def start_chatbot(prompt_text):
    pass
    st.write(" ")


if __name__ == "__main__":
    st.title("Generative AI Use Cases")
    prompt_text = st.text_input("Translate English to German:", value=" ")
    if prompt_text != " ":
        generate_text(prompt_text)

    seq2classify = st.text_input("Sequence to classify", value=" ")
    if seq2classify != " ":
        candidate_labels = ["POSITIVE", "NEUTRAL", "NEGATIVE"]
        classify_text(seq2classify, candidate_labels)

    prompt_text_sum = st.text_input("Enter text to summarize:", value=" ")
    if prompt_text_sum != " ":
        summarize_text(prompt_text_sum)

检索增强生成 (RAG 开发)

中文

什么是 RAG

检索增强生成 (RAG) 简介
  • 检索增强生成 (RAG) 是一种将传统文本生成技术与基于检索的方法相结合的方法,旨在提高对话式 AI 系统中生成响应的质量和相关性。
  • 在 GPT 等传统生成模型中,响应仅根据输入查询或上下文生成。然而,在 RAG 中,模型还会从数据库中检索相关文档或段落,并将它们纳入生成过程中。
关键概念
  • 检索模型:这些模型负责根据输入查询从数据库中检索相关文档或段落。
  • 生成模型:这些模型通过结合输入查询和检索到的文档中的信息来生成响应。
  • 语义搜索:RAG 依赖语义搜索技术来检索与输入查询语义相似的文档,而不是仅仅依赖关键词匹配。
优点
  • RAG 通过整合来自检索文档的外部知识,提高了生成响应的相关性和连贯性。
  • 它使聊天机器人能够提供信息量更大且与上下文相关的响应,从而增强整体用户体验。
应用
  • RAG 广泛应用于对话式 AI 系统、聊天机器人、问答系统和信息检索应用程序。
  • 它可应用于客户支持、医疗保健、教育和电子商务等各个领域,为用户查询提供个性化且准确的响应。

Français

Qu'est-ce que RAG ?

Introduction à la génération augmentée par récupération (RAG)
  • La génération augmentée par récupération (RAG) est une approche qui combine les techniques traditionnelles de génération de texte avec des méthodes basées sur la récupération pour améliorer la qualité et la pertinence des réponses générées dans les systèmes de conversation AI.
  • Dans les modèles génératifs traditionnels comme GPT, les réponses sont générées uniquement sur la base de la requête d'entrée ou du contexte. Cependant, dans RAG, le modèle récupère également des documents ou des passages pertinents d'une base de données et les intègre dans le processus de génération.
Concepts clés
  • Modèles de récupération : Ces modèles sont responsables de la récupération de documents ou passages pertinents d'une base de données sur la base de la requête d'entrée.
  • Modèles de génération : Ces modèles génèrent des réponses en incorporant des informations provenant à la fois de la requête d'entrée et des documents récupérés.
  • Recherche sémantique : RAG s'appuie sur des techniques de recherche sémantique pour récupérer des documents qui sont sémantiquement similaires à la requête d'entrée, plutôt que de se baser uniquement sur une correspondance de mots-clés.
Avantages
  • RAG améliore la pertinence et la cohérence des réponses générées en incorporant des connaissances externes provenant de documents récupérés.
  • Cela permet au chatbot de fournir des réponses plus informatives et contextuellement pertinentes, améliorant ainsi l'expérience utilisateur globale.
Applications
  • RAG est largement utilisé dans les systèmes de conversation AI, les chatbots, les systèmes de réponse aux questions et les applications de récupération d'informations.
  • Il peut être appliqué dans divers domaines tels que le support client, les soins de santé, l'éducation et le commerce électronique pour fournir des réponses personnalisées et précises aux requêtes des utilisateurs.

LangChain 及其组件概述:

中文

LangChain
  • LangChain 是一个框架,旨在促进检索模型与语言模型的集成,以完成检索增强生成任务。
  • 它为构建聊天机器人和对话式 AI 系统提供了一个统一的接口,并增强了响应生成能力。
组件
  • 自然语言处理 (NLP) 流水线: LangChain 包含一个全面的 NLP 流水线,用于分词、嵌入生成和语义相似度计算等任务。
  • 检索模型集成: LangChain 无缝集成了检索模型,允许系统根据输入查询检索相关文档或段落。

    • 密集检索阅读器 (DRQA): 该模型使用密集向量表示从大型语料库中检索相关文档,然后使用阅读器模型从这些文档中提取相关信息以生成响应。
    • 带检索机制的神经生成对话模型: 该模型首先使用信息检索技术从大量过往对话数据库中检索相关上下文或响应,然后根据检索到的上下文和当前输入生成响应。
    • 带检索增强生成的双编码器 (DIALOGPT): 该架构使用双编码器对输入查询和检索到的上下文进行编码,然后基于这种组合表示生成响应。它可以在对话数据上进行微调,以生成更具上下文相关性的响应。
    • 顺序检索模型 (SeqRM): 该模型从知识库中顺序检索相关段落,并将它们纳入生成过程。在生成的每一步,它都会根据当前上下文检索最相关的段落,并相应地生成下一个 token。
    • 用于阅读器的 BERT (BRR): 该模型采用基于 BERT 的检索器和阅读器组件。检索器从大型语料库中选择相关段落,阅读器从这些段落中提取相关信息以生成响应。
  • 语言模型集成: 它还集成了用于响应生成的语言模型,使系统能够通过整合输入查询和检索文档中的信息来生成连贯且与上下文相关的响应。
  • 向量数据库接口: LangChain 提供了一个与向量数据库交互的接口,允许用户高效地存储和检索文档嵌入以进行语义搜索。

    • Milvus: Milvus 是一个开源向量数据库,旨在管理和提供大规模向量嵌入服务。它支持多种相似度搜索算法,并提供高效的索引和查询能力。
    • Faiss: 由 Facebook AI Research (FAIR) 开发,Faiss 是一个广泛使用的库,用于高效的相似度搜索和密集向量聚类。它针对高维向量进行了优化,并提供 GPU 加速的索引和查询。
    • Annoy: Annoy (Approximate Nearest Neighbors Oh Yeah) 是一个带有 Python 绑定的 C++ 库,用于近似最近邻搜索。它专为大规模相似度搜索任务而设计,支持 CPU 和 GPU 实现。
    • Pinecone: Pinecone 是一个托管的向量数据库服务,提供实时相似度搜索和推荐功能。它提供无服务器架构、自动扩展以及与流行机器学习框架的集成。
    • 带向量插件的 Elasticsearch: Elasticsearch 是一个分布式搜索和分析引擎,可以通过插件扩展以支持向量数据。Elasticsearch 向量插件允许对向量嵌入进行索引和查询,从而在 Elasticsearch 中实现相似度搜索。
    • HNSW (Hierarchical Navigable Small World): 虽然不是独立的数据库,但 HNSW 是一种常用于近似最近邻搜索的数据结构和算法。它可以集成到现有数据库或搜索引擎中,以实现高效的相似度搜索。
用法
  • LangChain 可用于构建聊天机器人、问答系统和信息检索应用程序,利用生成式和基于检索的技术来生成响应。
  • 它提供了灵活性和可扩展性,允许开发人员根据特定用例和需求自定义和微调系统。

Français

LangChain
  • LangChain est un cadre qui facilite l'intégration de modèles de récupération avec des modèles de langage pour des tâches de génération augmentée par récupération.
  • Il fournit une interface unifiée pour la construction de chatbots et de systèmes de conversation AI avec des capacités améliorées de génération de réponses.
Composants
  • Pipeline de Traitement du Langage Naturel (NLP) : LangChain intègre un pipeline NLP complet pour des tâches telles que la tokenisation, la génération d'embedding et le calcul de similarité sémantique.
  • Intégration de Modèles de Récupération : LangChain intègre de manière transparente des modèles de récupération, permettant au système de récupérer des documents ou des passages pertinents en fonction de la requête d'entrée.

    • Retriever-Reader de Récupération Dense (DRQA) : Ce modèle récupère des documents pertinents d'un large corpus en utilisant des représentations vectorielles denses puis utilise un modèle lecteur pour extraire des informations pertinentes de ces documents afin de générer des réponses.
    • Modèle Conversationnel Génératif Neuronal avec Mécanisme de Récupération : Ce modèle récupère d'abord le contexte ou les réponses pertinents d'une grande base de données de conversations antérieures en utilisant des techniques de récupération d'informations puis génère des réponses basées à la fois sur le contexte récupéré et l'entrée actuelle.
    • Encodeur Dual avec Génération Augmentée par Récupération (DIALOGPT) : Cette architecture utilise un encodeur dual pour encoder à la fois la requête d'entrée et le contexte récupéré, puis génère une réponse basée sur cette représentation combinée. Il peut être ajusté sur des données conversationnelles pour générer des réponses plus contextuellement pertinentes.
    • Modèle de Récupération Séquentielle (SeqRM) : Ce modèle récupère séquentiellement des passages pertinents d'une base de connaissances et les intègre dans le processus de génération. À chaque étape de la génération, il récupère le passage le plus pertinent en fonction du contexte actuel et génère le jeton suivant en conséquence.
    • BERT pour Retriever-Reader (BRR) : Ce modèle emploie des composants retriever et reader basés sur BERT. Le retriever sélectionne des passages pertinents d'un large corpus, et le reader extrait des informations pertinentes de ces passages pour générer des réponses.
  • Intégration de Modèles de Langage : Il intègre également des modèles de langage pour la génération de réponses, permettant au système de générer des réponses cohérentes et contextuellement pertinentes en incorporant des informations à la fois de la requête d'entrée et des documents récupérés.
  • Interface de Base de Données Vectorielle : LangChain fournit une interface pour interagir avec les bases de données vectorielles, permettant aux utilisateurs de stocker et de récupérer efficacement des embeddings de documents pour la recherche sémantique.

    • Milvus : Milvus est une base de données vectorielle open-source conçue pour gérer et servir des embeddings vectoriels à grande échelle. Elle prend en charge une variété d'algorithmes de recherche de similarité et offre des capacités efficaces d'indexation et de requête.
    • Faiss : Développé par Facebook AI Research (FAIR), Faiss est une bibliothèque largement utilisée pour la recherche de similarité et le clustering de vecteurs denses efficaces. Elle est optimisée pour les vecteurs de haute dimension et offre des capacités d'indexation et de requête accélérées par GPU.
    • Annoy : Annoy (Approximate Nearest Neighbors Oh Yeah) est une bibliothèque C++ avec des liaisons Python pour la recherche approximative des plus proches voisins. Elle est conçue pour les tâches de recherche de similarité à grande échelle et prend en charge les implémentations CPU et GPU.
    • Pinecone : Pinecone est un service de base de données vectorielle géré qui fournit des capacités de recherche de similarité et de recommandation en temps réel. Il offre une architecture sans serveur, une mise à l'échelle automatique et une intégration avec des cadres d'apprentissage automatique populaires.
    • Elasticsearch avec Plugin Vectoriel : Elasticsearch est un moteur de recherche et d'analyse distribué qui peut être étendu avec des plugins pour supporter les données vectorielles. Le Plugin Vectoriel Elasticsearch permet l'indexation et la requête d'embeddings vectoriels, activant la recherche de similarité au sein d'Elasticsearch.
    • HNSW (Hierarchical Navigable Small World) : Bien qu'il ne soit pas une base de données autonome, HNSW est une structure de données et un algorithme couramment utilisé pour la recherche approximative des plus proches voisins. Il peut être intégré dans des bases de données ou des moteurs de recherche existants pour permettre une recherche de similarité efficace.
Utilisation
  • LangChain peut être utilisé pour construire des chatbots, des systèmes de réponse aux questions et des applications de récupération d'informations qui tirent parti des techniques génératives et basées sur la récupération pour la génération de réponses.
  • Il offre de la flexibilité et de l'extensibilité, permettant aux développeurs de personnaliser et d'ajuster le système selon des cas d'utilisation et des exigences spécifiques.

架构文档说明

中文

演示 - 我们将探索 LLM 的实现
  • 演示 - 我们将探索 LLM 的实现
  • 上下文提示 + LLM
  • 多源上下文提示 + LLM

Français

Démo - Nous allons explorer la mise en œuvre de LLM
  • Démo - Nous allons explorer la mise en œuvre de LLM
  • Contexte d'invite + LLM
  • Contexte d'invite multi-sources + LLM

代码 (RAG_Development/rag_demo.py) :

# !pip install -q torch transformers accelerate bitsandbytes transformers sentence-transformers faiss-cpu pypdf streamlit langchain==0.1.6 langchain-community==0.0.19 langchain-core==0.1.23
# !pip install -q torch transformers
# !pip install -q transformers sentence-transformers
# !pip install -q faiss-cpu pypdf streamlit
# !pip install -q langchain==0.1.6 langchain-community==0.0.19 langchain-core==0.1.23

import locale  # In Google Colab, use UTF-8 locale to install LangChain
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from transformers import pipeline
from langchain_community.llms import HuggingFacePipeline
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain.schema.runnable import RunnablePassthrough
import streamlit as st

locale.getpreferredencoding = lambda: "UTF-8"

# Constants
PDF_FILE_PATH = "test_pdf.pdf"  # Update with your file path
CHUNK_SIZE = 500
CHUNK_OVERLAP = 100
OLLAMA_MODEL_NAME = "mistral"

loader = PyPDFLoader(PDF_FILE_PATH)
pages = loader.load_and_split()

print(f"Pages from the loader: {pages[0]} \n\n")

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP
)
doc_splits = text_splitter.split_documents(pages)

print(f"Pages from the loader: {doc_splits} \n\n")

db = FAISS.from_documents(
    doc_splits, HuggingFaceEmbeddings(model_name="BAAI/bge-base-en-v1.5")
)
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 4})

## Summarization
bart_model_name = "facebook/bart-large-cnn"
summarizer = pipeline("summarization", model=bart_model_name)

llm = HuggingFacePipeline(pipeline=summarizer)

prompt = ChatPromptTemplate.from_messages(
    [("system", "Summarize the story about Daisy:\n\n{context}")]
)

llm_chain = LLMChain(llm=llm, prompt=prompt)

"""**Combine the LLM + Retriever to create the RAG**"""
# retriever = db.as_retriever()
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | llm_chain

# question = "Tell a story about a girl in the country side"

# print(llm_chain.invoke({"context": "", "question": question}))
# print('\n\n\n')
# print(rag_chain.invoke(question))

if __name__ == "__main__":
    st.title("Summarization with RAG Development")
    question = st.text_input("Summarize tex:", value=" ")
    if question != " ":
        st.title("Summarization - LLM Chain with no context")
        st.write(llm_chain.invoke({"context": "", "question": question})["text"])

    if question != " ":
        st.title("Summarization with RAG")
        st.write(rag_chain.invoke(question)["text"])

资源