LLM mejorado para la recuperación de resúmenes de artículos extensos de 10.000 palabras

Enlace: https://zhuanlan.zhihu.com/p/655272123
La aparición de ChatGPT nos permite ver las capacidades del modelo de lenguaje grande (LLM) en muchos aspectos, como la comprensión del lenguaje y el código, el seguimiento de instrucciones humanas y el razonamiento básico. , pero el problema de las alucinaciones [ 1] sigue siendo un desafío importante al que se enfrentan los grandes modelos de lenguaje actuales. En pocas palabras, el problema de las alucinaciones se produce cuando el LLM genera resultados incorrectos, absurdos o inconsistentes con los hechos. Además, la actualización de los datos (Data Freshness) es otro problema que ocurre cuando LLM genera resultados, es decir, es posible que LLM no pueda dar o dar respuestas desactualizadas a algunas preguntas urgentes. Mejorar los resultados generados de LLM mediante la recuperación de información externa relevante es actualmente una solución popular a los problemas anteriores. Esta solución se llama Retrieval Augmented LLM (Retrieval Augmented LLM). Este extenso artículo brindará una introducción relativamente completa a la solución de LLM con recuperación mejorada. Los contenidos principales incluyen:

  • Recuperar la introducción del concepto, la importancia y los problemas resueltos mediante LLM mejorado.
  • Recupere los módulos clave de LLM mejorado y sus métodos de implementación
  • Recupere algunos estudios de casos y aplicaciones de LLM mejorado

Este artículo puede considerarse como un resumen de mi estudio en este campo. Puede que no sea muy profesional y profundo, e inevitablemente habrá algunas imprecisiones. Las discusiones son bienvenidas (mi ID de WeChat: compañero de mucho tiempo). Para facilitar actualizaciones posteriores, también creé un repositorio de Github Una guía para la recuperación aumentada LLM [2] . Al mismo tiempo, bienvenido a seguir mi cuenta pública de WeChat "AI Thinking Bicycle"

La recuperación mejora el LLM, el LLM nos empodera.

¿Qué es la búsqueda mejorada LLM?

Retrieval Augmented LLM (Retrieval Augmented LLM), en pocas palabras, es proporcionar una base de datos externa para LLM. Para las preguntas de los usuarios (Consulta), a través de alguna tecnología de recuperación de información (Recuperación de información, IR), primero recupere las preguntas de los usuarios de la base de datos externa Relevante información y luego dejar que LLM combine esta información relevante para generar resultados. Este modo a veces se denomina generación aumentada de recuperación (RAG). La siguiente figura es un diagrama simple de LLM con recuperación mejorada.

Insertar descripción de la imagen aquí

El científico investigador de OpenAI, Andrej Karpathy, hizo una presentación sobre el estado actual del modelo GPT en la conferencia Microsoft Build 2023 hace algún tiempo, State of GPT [3] . La primera mitad de la presentación compartió cómo se entrenan paso a paso modelos como ChatGPT. La segunda mitad Esta parte comparte principalmente algunas direcciones de aplicación del modelo LLM, incluida una breve introducción a la dirección de aplicación del LLM con recuperación mejorada. La siguiente imagen es la introducción a esta dirección compartida por Andrej.

Insertar descripción de la imagen aquí

Las herramientas de recuperación de información tradicionales, como los motores de búsqueda como Google/Bing, solo tienen capacidades de recuperación ( solo recuperación ), ahora LLM incorpora datos y conocimientos masivos en sus enormes parámetros de modelo a través del proceso de entrenamiento previo y tiene capacidades de memoria ( Memoria - sólo ). Desde esta perspectiva, el LLM con recuperación mejorada está en el medio, combinando LLM con la recuperación de información tradicional y cargando información relevante en la memoria de trabajo de LLM a través de algunas técnicas de recuperación de información, es decir, la ventana de contexto de LLM (Ventana de contexto ) , que es decir, la entrada de texto máxima que LLM puede aceptar durante una sola generación.

El intercambio de Andrej no solo mencionó el método de aplicación para mejorar el LLM basado en la recuperación, sino que también a partir de la investigación y el resumen de la pila de tecnología de las empresas emergentes de IA realizadas por algunas instituciones de inversión reconocidas, también podemos ver la aplicación generalizada de la tecnología LLM. basado en la recuperación. Por ejemplo, en junio de este año, Sequoia Capital publicó un artículo sobre la gran pila de tecnología de modelos de lenguaje, The New Language Model Stack [4] , que proporcionó los resultados de una encuesta realizada a 33 empresas emergentes de IA en las que invirtió. Los resultados de la siguiente figura muestran que alrededor del 88% de los emprendedores afirmaron haber utilizado tecnología LLM mejorada basada en búsquedas en sus productos.

Insertar descripción de la imagen aquí

Casualmente, la famosa institución estadounidense de capital de riesgo A16Z también publicó un artículo resumido Arquitecturas emergentes para aplicaciones LLM [5] en junio de este año presentando la arquitectura actual de la aplicación LLM . La siguiente figura es la arquitectura típica de la aplicación LLM actual resumida en el artículo. entre los cuales la mayoría La forma en que Contextual Data es una idea para mejorar LLM a través de la recuperación.
Insertar descripción de la imagen aquí

Recuperar problemas resueltos por LLM mejorado

¿Por qué combinar los sistemas tradicionales de recuperación de información para mejorar el LLM? En otras palabras, ¿cuáles son los principales problemas que resuelve el LLM basado en la mejora de la recuperación? Esta parte del contenido se basa en lo que el grupo Chen Danqi de la Universidad de Princeton compartió anteriormente sobre los modelos de lenguaje basados ​​en la recuperación en la conferencia ACL 2023. Tutorial de ACL 2023: modelos y aplicaciones de lenguaje basados ​​en la recuperación [6]

Conocimiento de cola larga

Aunque la cantidad actual de datos de entrenamiento de LLM ya es muy grande, a menudo cientos de gigabytes de datos y billones de marcadores (Tokens), por ejemplo, los datos de entrenamiento previo de GPT-3 usan 300 mil millones de marcadores y LLaMA usa 1,4 billones de marcas. . Las fuentes de datos de entrenamiento también son muy ricas, como Wikipedia, libros, foros, códigos, etc. El número de parámetros del modelo LLM también es muy grande, desde miles de millones, decenas de miles de millones hasta cientos de miles de millones, pero LLM puede registrar en parámetros limitados. No es realista tener todo el conocimiento o la información, y la cobertura de los datos de entrenamiento también es limitada. Siempre habrá algún conocimiento de cola larga que no se puede cubrir en los datos de entrenamiento.

Para algunos conocimientos relativamente generales y populares, LLM generalmente puede generar resultados más precisos, pero para algunos conocimientos de cola larga, las respuestas generadas por LLM generalmente no son confiables. Este artículo en la conferencia ICML, Large Language Models Struggle to Learn Long-Tail Knowledge [7] , estudió la relación entre la precisión de LLM para la respuesta a preguntas basadas en hechos y la cantidad de documentos en campos relacionados en los datos previos al entrenamiento. y descubrió que existe una gran relevancia, es decir, cuanto mayor sea el número de documentos relevantes en los datos previos a la capacitación, mayor será la precisión de la respuesta de LLM a las preguntas y respuestas fácticas. De este estudio se puede sacar una conclusión simple: LLM tiene una capacidad de aprendizaje relativamente débil para el conocimiento de cola larga. La siguiente imagen es la curva de correlación dibujada en el artículo.

Insertar descripción de la imagen aquí

Para mejorar la capacidad de LLM para aprender conocimientos de cola larga, es fácil pensar en agregar conocimientos de cola larga más relevantes a los datos de entrenamiento o aumentar el número de parámetros del modelo, aunque ambos métodos tienen ciertos efectos, como mencionado anteriormente También hay soporte de datos experimentales en el artículo, pero estos dos métodos no son económicos, es decir, se requiere una gran cantidad de datos de entrenamiento y parámetros del modelo para mejorar en gran medida la precisión de la respuesta de LLM al conocimiento de cola larga. Al proporcionar información relevante como contexto (Contexto) durante la inferencia LLM a través del método de recuperación, no solo se puede lograr una mejor precisión de respuesta, sino que también es una forma más económica. La siguiente imagen muestra la precisión de respuesta de modelos de diferentes tamaños cuando se proporciona información relevante. Comparando la imagen anterior, podemos ver que para modelos con la misma magnitud de parámetro, cuando se proporciona una pequeña cantidad de documentos relevantes para participar en el entrenamiento previo , let El modelo utiliza información relevante durante la fase de inferencia y la precisión de su respuesta mejora enormemente.

Insertar descripción de la imagen aquí

datos privados

La mayoría de las etapas previas a la capacitación de LLM de propósito general, como ChatGPT, utilizan datos públicos y no incluyen datos privados, por lo que falta algo de conocimiento del dominio privado. Por ejemplo, si le preguntas a ChatGPT sobre el conocimiento interno de una determinada empresa, lo más probable es que ChatGPT no lo sepa o lo invente al azar. Aunque los datos privados se pueden agregar en la etapa previa al entrenamiento o usarse para realizar ajustes, los costos de entrenamiento e iteración son altos. Además, la investigación y la práctica han demostrado que LLM puede filtrar datos de capacitación a través de algunos métodos de ataque específicos. Si los datos de capacitación contienen información privada, es probable que se produzca una fuga de información de privacidad. Por ejemplo, los investigadores de este artículo Extracción de datos de entrenamiento de modelos de lenguaje grandes [8] utilizaron la consulta construida para extraer nombres públicos personales, direcciones de correo electrónico, números de teléfono e información de direcciones del modelo GPT-2 El artículo también encontró que los modelos de mayor escala son más vulnerables a los ataques que los de menor escala.

Insertar descripción de la imagen aquí

Si se utilizan datos privados como una base de datos externa, LLM puede recuperar directamente información relevante de la base de datos externa al responder preguntas basadas en datos privados y luego combinar la información relevante recuperada para responder. Esto elimina la necesidad de que LLM recuerde el conocimiento privado en parámetros mediante capacitación previa o ajuste, lo que no solo ahorra costos de capacitación o ajuste, sino que también evita el riesgo de fuga de datos privados hasta cierto punto.

Actualización de datos

Dado que el conocimiento aprendido en LLM proviene de datos de capacitación, aunque el ciclo de actualización de la mayoría de los conocimientos no será muy rápido, todavía habrá algunos conocimientos o información que se actualizarán con mucha frecuencia. La información que LLM aprende de los datos previos a la capacitación puede volverse obsoleta fácilmente. Por ejemplo, el modelo GPT-4 utiliza datos previos al entrenamiento a partir de 2021-09, por lo que cuando se trata de eventos o información posterior a esta fecha, se negará a responder o dará respuestas desactualizadas o inexactas. El siguiente ejemplo pregunta a GPT-4 quién es el actual CEO de Twitter. La respuesta dada por GPT-4 sigue siendo Jack Dorsey y le recordará que la respuesta puede estar desactualizada.

Insertar descripción de la imagen aquí

Si el conocimiento actualizado con frecuencia se utiliza como una base de datos externa para que LLM lo recupere cuando sea necesario, el conocimiento de LLM se puede actualizar y ampliar sin volver a capacitar a LLM, resolviendo así el problema de la actualización de los datos de LLM.

Verificación de fuentes y explicabilidad.

Normalmente, el resultado generado por LLM no indica su fuente, lo que dificulta explicar por qué se genera tal como está. Al proporcionar fuentes de datos externas a LLM y permitirle generar en función de la información relevante recuperada, se establece una correlación entre los resultados generados y la fuente de información, de modo que los resultados generados se puedan rastrear hasta la fuente de referencia, haciéndolos interpretables y controlables. El sexo se mejora mucho. Es decir, podrás saber en qué información relevante se basa LLM para generar la respuesta. Bing Chat es un producto típico que utiliza la recuperación para mejorar los resultados de LLM. La siguiente figura muestra una captura de pantalla del producto Bing Chat. Puede ver que se proporcionan enlaces a información relevante en las respuestas generadas.

Insertar descripción de la imagen aquí

Al utilizar la recuperación para mejorar el resultado de LLM, un paso muy importante es encontrar fragmentos de información relevantes de datos externos a través de algunas técnicas relacionadas con la recuperación, y luego usar los fragmentos de información relevantes como contexto para que LLM haga referencia al generar respuestas. Algunas personas pueden decir que a medida que la ventana de contexto de LLM se vuelve cada vez más larga, el paso de recuperar información relevante no es necesario y la mayor cantidad de información posible se proporciona directamente en el contexto. Por ejemplo, la longitud máxima de contexto que recibe actualmente el modelo GPT-4 es 32K, y el modelo Claude permite una longitud máxima de contexto de 100K [9] .

Aunque la ventana de contexto de LLM es cada vez más grande, el paso de recuperar información relevante sigue siendo importante y necesario. Por un lado, la arquitectura de red actual de LLM determina que la longitud de su ventana de contexto tiene un límite superior y no crecerá infinitamente. Además, la ventana de contexto aparentemente grande en realidad contiene información relativamente limitada: por ejemplo, la extensión de 32K solo puede ser equivalente a la extensión de una tesis de graduación universitaria. Por otro lado, los estudios han demostrado que proporcionar una pequeña cantidad de información más relevante conduce a una mayor precisión en las respuestas del LLM que proporcionar una gran cantidad de información sin filtrar. Por ejemplo, este artículo de la Universidad de Stanford, Lost in the Middle [10] , proporciona los siguientes resultados experimentales: se puede ver que la precisión de la respuesta de LLM disminuye a medida que aumenta el número de documentos proporcionados en la ventana de contexto.

Insertar descripción de la imagen aquí

La tecnología de recuperación se utiliza para encontrar los fragmentos de información más relevantes para la pregunta de entrada a partir de una gran cantidad de datos externos. Si bien proporciona una referencia para que LLM genere respuestas, también filtra la interferencia de cierta información irrelevante hasta cierto punto para mejorar la exactitud de las respuestas generadas. Además, cuanto mayor sea la ventana de contexto, mayor será el costo de la inferencia. Por lo tanto, la introducción de pasos de recuperación de información relevantes también puede reducir los costos de razonamiento innecesarios.

Módulos clave

Para construir un sistema LLM mejorado con recuperación, los módulos clave que deben implementarse y los problemas que deben resolverse incluyen:

  • Módulo de indexación y datos : cómo manejar datos externos y crear índices
  • Módulo de consulta y recuperación : cómo recuperar información relevante de forma precisa y eficiente
  • Módulo de generación de respuestas : cómo utilizar la información relevante recuperada para mejorar el resultado de LLM

Módulo de datos e índice

recopilación de datos

La función del módulo de adquisición de datos es generalmente convertir datos externos de múltiples fuentes, tipos y formatos en un objeto de documento unificado (Objeto de documento) para facilitar el procesamiento y uso posteriores. Además de contener el contenido del texto original, el objeto del documento generalmente también contiene la metainformación del documento (Metadatos), que puede usarse para su posterior recuperación y filtrado. La metainformación incluye, entre otros:

  • Información de tiempo, como tiempos de creación y modificación de documentos.
  • Título, palabras clave, entidades (personas, lugares, etc.), categorías de texto y otra información.
  • Resúmenes de textos y resúmenes.

Parte de la metainformación se puede obtener directamente y otra se puede obtener con la ayuda de la tecnología PNL, como extracción de palabras clave, reconocimiento de entidades, clasificación de texto, resumen de texto, etc. Se pueden utilizar modelos y marcos de PNL tradicionales o implementarlos basándose en LLM.

Insertar descripción de la imagen aquí

Las fuentes de datos externos pueden ser diversas, como

  • Varios documentos Doc, Hojas de cálculo, presentaciones de Diapositivas, programaciones de Calendario, archivos de Drive, etc. en la suite de Google
  • Datos de comunidades de chat como Slack y Discord
  • Archivos de código alojados en Github, Gitlab
  • Varios documentos sobre Confluence
  • datos de la página web
  • Datos devueltos por API
  • archivos locales

Los tipos y formatos de archivos de datos externos también pueden ser diversos, como

  • Desde el punto de vista del tipo de datos, incluido texto sin formato, tablas, documentos de presentación, código, etc.
  • Desde la perspectiva del formato de almacenamiento de archivos, incluidos txt, csv, pdf, markdown, json y otros formatos

Los datos externos pueden ser multilingües, como chino, inglés, alemán, japonés, etc. Además, también puede ser multimodal, pues además de la modalidad de texto comentada anteriormente, también incluye imágenes, audio, vídeo y otras modalidades. Sin embargo, los datos externos discutidos en este artículo se limitarán a la modalidad de texto.

Al crear un módulo de adquisición de datos, los datos de diferentes fuentes, tipos, formatos e idiomas pueden requerir diferentes métodos de lectura.

fragmentación de texto

La fragmentación de texto es el proceso de cortar texto largo en partes más pequeñas, como cortar un artículo largo en párrafos relativamente cortos. Entonces, ¿por qué fragmentar el texto? Por un lado, la longitud del contexto actual de LLM es limitada: poner directamente todo un artículo extenso como información relevante en la ventana de contexto de LLM puede exceder el límite de longitud. Por otro lado, para textos largos, incluso si están relacionados con la pregunta de consulta, generalmente no son del todo relevantes. El fragmentación puede eliminar contenido irrelevante hasta cierto punto y filtrar algunos para la posterior generación de respuestas. Ruido innecesario.

La calidad de la segmentación del texto afectará en gran medida el efecto de la generación de respuestas posteriores. Si la segmentación no es buena, se cortará la correlación entre el contenido. Por tanto, es importante diseñar una buena estrategia de fragmentación. Las estrategias de fragmentación incluyen métodos de segmentación específicos (como segmentar por oraciones o párrafos), el tamaño apropiado de los bloques, si se permite la superposición entre diferentes bloques, etc. El blog de Pinecone Chunking Strategies for LLM Applications [11] ofrece algunos factores que deben tenerse en cuenta al diseñar estrategias de fragmentación.

  • Características del contenido original : ¿El contenido original es largo (publicaciones de blog, libros, etc.) o corto (tweets, mensajes instantáneos, etc.) y qué formato tiene (HTML, Markdown, Code o LaTeX, etc.)? • Diferentes características del contenido pueden aplicarse de manera diferente.
  • Métodos de indexación posteriores : actualmente, el índice más utilizado es la indexación vectorial de contenido fragmentado. Los diferentes modelos de incrustación de vectores pueden tener sus propios tamaños de fragmentos aplicables. Por ejemplo, el modelo de transformador de oración es más adecuado para contenido a nivel de oración. Para la incrustación, el tamaño de bloque adecuado del modelo text-embedding-ada-002 de OpenAI está entre 256 y 512 etiquetas;
  • Longitud de la pregunta : se debe considerar la longitud de la pregunta porque es necesario recuperar fragmentos de texto relevantes en función de la pregunta;
  • Cómo utilizar el contenido relevante recuperado en la etapa de generación de respuesta : si el contenido relevante recuperado se proporciona directamente a LLM como parte del mensaje, entonces se debe considerar el límite de longitud de entrada de LLM al diseñar el tamaño del bloque.
Método de implementación de bloques

Entonces, ¿cómo implementar el bloqueo de texto? En términos generales, el proceso general de implementación de la fragmentación de texto es el siguiente:

  1. Corte el texto largo original en pequeñas unidades semánticas, donde las unidades semánticas suelen estar a nivel de oración o de párrafo;
  2. Fusione estas pequeñas unidades semánticas en fragmentos más grandes hasta alcanzar el tamaño de fragmento establecido (Tamaño del fragmento), luego trate el fragmento como un fragmento de texto independiente;
  3. El siguiente fragmento de texto se construye de forma iterativa y, por lo general, se establece una superposición entre fragmentos de texto adyacentes para mantener la coherencia semántica.

Entonces, ¿cómo dividir el texto largo original en pequeñas unidades semánticas? El método más utilizado es dividir según delimitadores, como puntos (.), nuevas líneas (\n), espacios, etc. Además de usar un solo separador para una segmentación simple, también puede definir un conjunto de separadores para una segmentación iterativa. Por ejemplo, al definir ["\n\n", "\n", " ", ""]dicho conjunto de separadores, al segmentar, primero use el primer separador para segmentar (implementando algo similar a los párrafos) (El efecto de la segmentación). Una vez completada la primera segmentación, los bloques que excedan el tamaño preestablecido continuarán segmentándose utilizando separadores posteriores, y así sucesivamente. Este método de segmentación puede mantener mejor la estructura jerárquica del texto original.

Para algunos textos estructurados, como código, Markdown, LaTeX y otros textos, es posible que deba considerarlos por separado al segmentar:

  • \nclass Por ejemplo, en archivos de código Python, es posible que necesite agregar algo similar al delimitador \ndef para garantizar la integridad de los bloques de código de clases y funciones;
  • Por ejemplo, los archivos Markdown se organizan a través de diferentes niveles de encabezados, es decir, diferentes números de símbolos #. Esta estructura jerárquica se puede mantener utilizando separadores específicos al dividir.

La configuración del tamaño del bloque de texto también es un factor importante a considerar en la estrategia de fragmentación: si es demasiado grande o demasiado pequeño, afectará el efecto de la generación de la respuesta final. El método de cálculo más utilizado para el tamaño del bloque de texto puede basarse directamente en la cantidad de caracteres (nivel de carácter) o en la cantidad de tokens (nivel de token). En cuanto a cómo determinar el tamaño de bloque apropiado, esto varía de un escenario a otro y es difícil tener un estándar unificado. La elección se puede hacer evaluando los efectos de diferentes tamaños de bloque.

Algunos de los métodos de bloqueo mencionados anteriormente tienen implementaciones correspondientes en LangChain [12] . Por ejemplo, el siguiente ejemplo de código

from langchain.text_splitter import CharacterTextSplitter
from langchain.text_splitter import RecursiveCharacterTextSplitter, Language

# text split
text_splitter = RecursiveCharacterTextSplitter(
 # Set a really small chunk size, just to show.
 chunk_size = 100,
 chunk_overlap  = 20,
 length_function = len,
 add_start_index = True,
)

# code split
python_splitter = RecursiveCharacterTextSplitter.from_language(
 language=Language.PYTHON, 
 chunk_size=50, 
 chunk_overlap=0 
)

# markdown split
md_splitter = RecursiveCharacterTextSplitter.from_language(  
 language=Language.MARKDOWN, 
 chunk_size=60, 
 chunk_overlap=0 
)

índice de datos

Después de las operaciones anteriores de lectura de datos y segmentación de texto, es necesario indexar los datos procesados. Un índice es una estructura de datos que se utiliza para recuperar rápidamente contenido de texto relevante para la consulta de un usuario. Es uno de los componentes básicos centrales del LLM con recuperación mejorada.

A continuación se muestran algunas estructuras de índice comunes. Para ilustrar diferentes estructuras de índice, se introduce el concepto de nodo. Aquí, los nodos son los fragmentos de texto (Chunks) generados después de segmentar el documento en el paso anterior. El siguiente diagrama de estructura de índice proviene del documento de LlamaIndex Cómo funciona cada índice [13] .

índice encadenado

Los índices encadenados indexan secuencialmente bloques de texto a través de la estructura de una lista vinculada. En las fases posteriores de recuperación y generación, todos los nodos se pueden simplemente atravesar secuencialmente o se puede realizar un filtrado basado en palabras clave.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

índice de árbol

Un índice de árbol construye un conjunto de nodos (bloques de texto) en una estructura de índice jerárquica similar a un árbol que se construye hacia arriba a partir de nodos hoja (bloques de texto originales), siendo cada nodo principal un resumen de un nodo secundario. En la fase de recuperación, puede recorrer hacia abajo desde el nodo raíz o utilizar directamente la información del nodo raíz. Los índices de árbol proporcionan una forma más eficaz de consultar bloques largos de texto y también se pueden utilizar para extraer información de diferentes partes del texto. A diferencia de los índices encadenados, los índices de árbol no requieren consultas secuenciales.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Índice de la tabla de palabras clave

El índice de la tabla de palabras clave extrae palabras clave de cada nodo y construye un mapeo de muchos a muchos de cada palabra clave al nodo correspondiente, lo que significa que cada palabra clave puede apuntar a múltiples nodos y cada nodo también puede contener múltiples palabras clave. Durante la fase de recuperación, los nodos se pueden filtrar según las palabras clave en las consultas de los usuarios.
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

índice vectorial

La indexación de vectores es actualmente el método de indexación más popular. Este método generalmente utiliza el modelo de incrustación de texto para asignar el bloque de texto a un vector de longitud fija y luego lo almacena en la base de datos de vectores . Durante la recuperación, el texto de la consulta del usuario se asigna a un vector utilizando el mismo modelo de incrustación de texto y luego se obtienen el nodo o los nodos más similares en función del cálculo de similitud de vectores.

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

La declaración anterior involucra tres conceptos importantes en la indexación y recuperación de vectores: modelo de incrustación de texto , recuperación de vectores similar y base de datos de vectores . Los detalles se explican uno por uno a continuación.

modelo de incrustación de texto

El modelo de incrustación de texto convierte texto no estructurado en vectores estructurados (Vector), actualmente se utilizan comúnmente vectores densos obtenidos mediante aprendizaje.

Insertar descripción de la imagen aquí

Actualmente existen muchos modelos de incrustación de texto para elegir, como

  • Los primeros modelos Word2Vec, GloVe, etc. rara vez se utilizan en la actualidad.
  • El modelo Sentence Transformers [14] basado en el preentrenamiento de la red gemela BERT tiene un mejor efecto de incrustación en las oraciones.
  • El modelo text-embedding-ada-002 [15] proporcionado por OpenAI funciona bien en la incrustación y puede manejar texto con una longitud máxima de 8191 tokens.
  • El modelo Instructor [16] , que es un modelo de incrustación de texto ajustado mediante instrucciones, puede proporcionar instrucciones de tareas para generar una personalización relativa según las tareas (como clasificación, recuperación, agrupación, evaluación de texto, etc.) y campos (como ciencias). , finanzas, etc.) vectores de incrustación de texto optimizados sin ningún ajuste
  • Modelo BGE [17] : el modelo de vector semántico chino e inglés de código abierto del Instituto de Investigación Zhiyuan, actualmente ocupa el primer lugar en las listas de MTEB en chino e inglés.

La siguiente es la lista MTEB Leaderboard [18] para evaluar el efecto de los modelos de incrustación de texto (a partir del 18 de agosto de 2023). Vale la pena señalar que estos modelos de incrustación de texto disponibles en el mercado no están ajustados para tareas posteriores específicas, por lo que es posible que no necesariamente funcionen lo suficientemente bien en tareas posteriores. En general, la mejor manera es volver a entrenar o ajustar su propio modelo de incrustación de texto en datos específicos posteriores.

Insertar descripción de la imagen aquí

Búsqueda de vectores similares

El problema que debe resolverse mediante la recuperación de vectores similares es que, dado un vector de consulta, cómo recuperar de manera precisa y eficiente uno o más vectores que son similares a él a partir de vectores candidatos. El primero es la elección del método de medición de similitud , que puede utilizar similitud de coseno, producto escalar, distancia euclidiana, distancia de Hamming, etc. En circunstancias normales, la similitud de coseno se puede utilizar directamente. El segundo es la elección del algoritmo de recuperación de similitudes y el método de implementación: la magnitud de los vectores candidatos, la velocidad de recuperación y los requisitos de precisión, las limitaciones de memoria, etc., son factores que deben considerarse.

Cuando el número de vectores candidatos es relativamente pequeño, por ejemplo, solo hay decenas de miles de vectores, entonces la biblioteca Numpy puede implementar una recuperación de vectores similar, que es simple de implementar, altamente precisa y rápida. Un blogger extranjero hizo una prueba de referencia simple y descubrió: ¿Realmente necesita una base de datos de vectores ? [19] Cuando el número de vectores candidatos es inferior a 100.000, se implementó comparando Numpy con otra recuperación eficiente aproximada del vecino más cercano. Biblioteca Hnswlib [20 ] , descubrió que no existe una diferencia de orden de magnitud en la eficiencia de recuperación, pero el proceso de implementación de Numpy es más simple.

Insertar descripción de la imagen aquí

El siguiente es un código de implementación simple usando Numpy:

import numpy as np

# candidate_vecs: 2D numpy array of shape N x D
# query_vec: 1D numpy array of shape D
# k: number of top k similar vectors

sim_scores = np.dot(candidate_vecs, query_vec)
topk_indices = np.argsort(sim_scores)[::-1][:k]
topk_values = sim_scores[topk_indices]

Para la recuperación de similitudes de vectores a gran escala, no es apropiado utilizar la biblioteca Numpy y se necesita una solución de implementación más eficiente. Faiss [21] , que es de código abierto por el equipo de Facebook , es una buena opción. Faiss es una biblioteca para búsqueda eficiente de similitudes y agrupación de vectores. Implementa muchos algoritmos para buscar en colecciones de vectores de cualquier tamaño. Además de ejecutarse en la CPU, algunos algoritmos también admiten la aceleración de GPU. Faiss contiene una variedad de algoritmos de recuperación de similitudes. El algoritmo a utilizar depende de factores como el volumen de datos, la frecuencia de recuperación, la precisión y la velocidad de recuperación.

El blog de Pinecone Índices de vecinos más cercanos para búsqueda de similitud [22] proporciona una introducción detallada a varios índices comúnmente utilizados en Faiss. La siguiente figura es una comparación cualitativa de varios índices en diferentes dimensiones:

Insertar descripción de la imagen aquí

base de datos vectorial

Es posible que el esquema de recuperación de similitudes de vectores basado en Numpy y Faiss mencionado anteriormente aún carezca de algunas funciones si se aplica a productos reales, como:

  • Alojamiento y respaldo de datos
  • Gestión de datos, como inserción, eliminación y actualización de datos.
  • Almacenamiento de datos originales y metadatos correspondientes a vectores.
  • Escalabilidad, incluida la expansión vertical y horizontal

Así surgió la base de datos vectorial . En pocas palabras, una base de datos vectorial es una base de datos que se utiliza específicamente para almacenar, administrar y consultar datos vectoriales, y puede lograr una recuperación, agrupación, etc. similar de datos vectoriales. Las bases de datos vectoriales actualmente populares incluyen Pinecone [23] , Vespa [24] , Weaviate [25] , Milvus [26] , Chroma [27] , Tencent Cloud VectorDB [28] , etc., la mayoría de las cuales proporcionan productos de código abierto.

El blog de Pinecone What is a Vector Database [29] proporciona una introducción relativamente sistemática a los principios relevantes y la composición de las bases de datos vectoriales. La siguiente imagen es un flujo de procesamiento de datos común de una base de datos vectorial que se proporciona en el artículo:

Insertar descripción de la imagen aquí

  1. Indexación : Indexación de vectores utilizando algoritmos como Cuantización de producto (Cuantización de producto), Hash sensible a la localidad (LSH), HNSW, etc. Este paso asigna el vector a una estructura de datos para lograr una búsqueda más rápida.
  2. Consulta : compare el vector de consulta y el vector de índice para encontrar vectores similares vecinos más cercanos.
  3. Postprocesamiento : en algunos casos, después de recuperar el vector vecino más cercano de la base de datos de vectores, se posprocesa y luego se devuelve el resultado final.

El uso de una base de datos vectorial es relativamente simple. El siguiente es un código de muestra para usar Python para operar la base de datos vectorial Pinecone:

# install python pinecone client
# pip install pinecone-client
import pinecone 
# initialize pinecone client
pinecone.init(api_key="YOUR_API_KEY", environment="YOUR_ENVIRONMENT")
# create index 
pinecone.create_index("quickstart", dimension=8, metric="euclidean")
# connect to the index
index = pinecone.Index("quickstart")
# Upsert sample data (5 8-dimensional vectors) 
index.upsert([ 
              ("A", [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]), 
              ("B", [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]), 
              ("C", [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]), 
              ("D", [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]), 
              ("E", [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) 
            ])

# query
index.query( 
 vector=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], 
 top_k=3, 
 include_values=True 
            ) 

# Returns: 
# {'matches': [{'id': 'C', 
#               'score': 0.0, 
#               'values': [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]}, 
#              {'id': 'D', 
#               'score': 0.0799999237, 
#               'values': [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]}, 
#              {'id': 'B', 
#               'score': 0.0800000429, 
#               'values': [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]}], 
# 'namespace': ''}

# delete index 
pinecone.delete_index("quickstart")

Módulo de consulta y recuperación

transformación de consulta

El método de expresión del texto de consulta afecta directamente a los resultados de la búsqueda y pequeños cambios en el texto pueden generar resultados muy diferentes. Usar directamente el texto de consulta original para la recuperación puede ser simple y efectivo en muchos casos, pero a veces puede ser necesario realizar algunas transformaciones en el texto de la consulta para obtener mejores resultados de recuperación, lo que es más probable que genere mejores resultados de respuesta en el futuro. A continuación se enumeran varios métodos comunes de transformación de consultas.

Transformación 1: reescritura sinónimo

Vuelva a escribir la consulta original en diferentes expresiones con la misma semántica. El trabajo de reescritura se puede completar llamando a LLM. Por ejemplo, para una consulta tan original: What are the approaches to Task Decomposition?, se puede reescribir en las siguientes expresiones sinónimas:

¿Cómo se puede abordar la descomposición de tareas?

¿Cuáles son los diferentes métodos de descomposición de tareas?

¿Cuáles son los distintos enfoques para descomponer tareas?
Para cada expresión de consulta, se recupera por separado un conjunto de documentos relevantes y luego todos los resultados de la recuperación se deduplican y fusionan para obtener un conjunto más grande de documentos relevantes candidatos. Al reescribir la misma consulta en varias consultas sinónimas, se pueden superar las limitaciones de una sola consulta y se puede obtener un conjunto más rico de resultados de búsqueda.

Transformación 2: descomposición de consultas

Estudios relevantes han demostrado que ( autopregunta [30] , ReAct [31] ), cuando LLM responde preguntas complejas, si las preguntas complejas se descomponen en subpreguntas relativamente simples, el rendimiento de la respuesta será mejor. Aquí se puede dividir en descomposición de un solo paso y descomposición de varios pasos .

La descomposición en un solo paso transforma una consulta compleja en múltiples subconsultas simples y fusiona la respuesta a cada subconsulta como una respuesta a la consulta compleja original.

Insertar descripción de la imagen aquí

Para la descomposición de varios pasos , una consulta compleja inicial dada se convertirá en múltiples subconsultas paso a paso, y la siguiente pregunta de consulta se generará en función de los resultados de la respuesta del paso anterior hasta que no se puedan hacer más preguntas. Finalmente, las respuestas de cada paso se combinan para generar el resultado final.

Insertar descripción de la imagen aquí

Transformación 3: HyDE

HyDE [32] , el nombre completo es Hypothetical Document Embeddings. Dada una consulta inicial, primero use LLM para generar un documento o respuesta hipotética, y luego use este documento o respuesta hipotética como una nueva consulta para su recuperación, en lugar de usar directamente la inicial. consulta. Esta transformación puede generar un documento hipotético engañoso o una respuesta sin contexto, lo que puede resultar en una respuesta incorrecta que no sea relevante para la consulta original. Aquí hay un ejemplo dado en el documento:

Insertar descripción de la imagen aquí

Clasificación y posprocesamiento

Después del proceso de recuperación anterior, es posible que obtenga muchos documentos relacionados, que deberán filtrarse y ordenarse. Las estrategias comunes de filtrado y clasificación incluyen:

  • Filtrar y ordenar según la puntuación de similitud
  • Filtrar según palabras clave, como limitar la inclusión o exclusión de determinadas palabras clave.
  • Permita que LLM reordene según los documentos relevantes devueltos y sus puntuaciones de relevancia
  • Filtrar y ordenar según el tiempo, como filtrar solo los documentos relevantes más recientes
  • Similitud de ponderación basada en el tiempo, luego ordenar y filtrar

Módulo de generación de respuestas

Estrategia de generación de respuestas

El módulo de recuperación recupera bloques de texto relevantes según las consultas de los usuarios, y el módulo de generación de respuestas permite a LLM utilizar la información relevante recuperada para generar respuestas a la consulta original. Hay algunas estrategias diferentes de generación de respuestas en LlamaIndex.

Una estrategia es combinar secuencialmente cada fragmento de texto relevante recuperado, revisando continuamente las respuestas generadas cada vez. En este caso, habrá tantas convocatorias de LLM como bloques de texto relevantes independientes. Otra estrategia es completar el mensaje con tantos bloques de texto como sea posible en cada llamada de LLM. Si no se puede completar un mensaje, utilice operaciones similares para construir varios mensajes. Se puede utilizar la misma estrategia de corrección de respuesta que la anterior para varias llamadas de mensaje.

Responder para generar una plantilla de mensaje

A continuación se muestra una plantilla de mensaje proporcionada en LlamaIndex para generar una respuesta. Como puede ver en esta plantilla, puede usar algunos delimitadores (como ------) para distinguir el texto de la información relevante. También puede especificar si LLM necesita combinar su propio conocimiento para generar una respuesta y cuándo proporcionando información relevante. Si no ayuda, ¿quieres responder o no?

template = f'''
Context information is below.
---------------------
{
      
      context_str}
---------------------
Using both the context information and also using your own knowledge, answer the question: {
      
      query_str}

If the context isn't helpful, you can/don’t answer the question on your own.
'''

La plantilla de mensajes a continuación permite a LLM revisar continuamente las respuestas existentes.

template = f'''
The original question is as follows: {
      
      query_str}
We have provided an existing answer: {
      
      existing_answer}
We have the opportunity to refine the existing answer (only if needed) with some more context below.
------------
{
      
      context_str}
------------
Using both the new context and your own knowledege, update or repeat the existing answer.
'''

Estudios de casos y aplicaciones

Complemento de búsqueda ChatGPT

Complemento de recuperación ChatGPT El complemento de recuperación ChatGPT [33] es un ejemplo oficial proporcionado por OpenAI para mejorar el LLM a través de la recuperación. Implementa una forma para que ChatGPT acceda al conocimiento privado. Ha recibido mucha atención en el almacén de código abierto en Github en un breve período. período de tiempo. . El siguiente es un diagrama esquemático del principio interno del complemento de recuperación ChatGPT ( fuente de la imagen: openai-chatgpt-retrieval-plugin-and-postgresql-on-azure [34] ).

Insertar descripción de la imagen aquí

En términos de diseño de interfaz API, el complemento de búsqueda proporciona las siguientes interfaces:

  • /upsert: Esta interfaz primero divide uno o más documentos de texto cargados en bloques de texto, cada bloque de texto tiene un tamaño de 200 tokens, luego utiliza el modelo de incrustación de texto de OpenAI para convertir los bloques de texto en vectores y, finalmente, junto con el texto original y la metainformación. Como una base de datos vectorial, el repositorio de código implementa soporte para casi todas las bases de datos vectoriales convencionales.
  • /upsert-file: Esta interfaz permite cargar un solo archivo en formatos PDF, TXT, DOCX, PPTX y MD. Después de convertirlo primero a texto plano, el proceso de procesamiento posterior es el mismo que el de la /upsertinterfaz.
  • /query: Esta interfaz implementa una consulta determinada y devuelve los bloques de texto más relevantes para la consulta. El principio de implementación también se basa en una recuperación de vectores similar. filterLos usuarios pueden filtrar documentos a través del parámetro en la solicitud y top_kespecificar la cantidad de bloques de texto relevantes que se devolverán a través del parámetro.
  • /delete: Esta interfaz implementa la operación de eliminación de uno o más documentos de la base de datos vectorial.

LlamaIndex y LangChain

LlamaIndex [35] es un marco de datos que sirve aplicaciones LLM, brindando funciones como importar, estructurar, indexar y consultar fuentes de datos externas. Gran parte de la estructura y contenido de este artículo se basa en la documentación de LlamaIndex, que es mencionado en el artículo LlamaIndex básicamente tiene implementaciones correspondientes para muchos de los módulos, algoritmos y estrategias mencionados, y proporciona API relevantes de alto y bajo nivel.

LlamaIndex incluye principalmente los siguientes componentes y características:

  • Conector de datos: puede importar datos de múltiples fuentes de datos. Existe un proyecto especial Llama Hub [36] que puede conectar datos de múltiples fuentes.
  • Índice de datos: admite múltiples índices diferentes para leer datos para facilitar su recuperación posterior.
  • Motor de consulta y diálogo: admite tanto el motor de interacción de consulta de ronda única como el motor de interacción de diálogo de ronda múltiple
  • Integración de aplicaciones: se puede integrar fácilmente con algunas aplicaciones populares, como ChatGPT, LangChain, Flask, Docker, etc.

El siguiente es un diagrama esquemático del marco general de LlamaIndex.

Insertar descripción de la imagen aquí

Además de LlamaIndex, LangChain [37] también es un marco de desarrollo de aplicaciones LLM actualmente popular, que también contiene algunos componentes relacionados para LLM con recuperación mejorada, pero en comparación, LlamaIndex se centra más en el campo relativamente pequeño de LLM con recuperación mejorada. LangChain cubre una gama más amplia de áreas, como aplicaciones en cadena de LLM, creación y gestión de Agentes, etc. La siguiente imagen es un diagrama esquemático del proceso general del módulo Recuperación [38] en LangChain, incluida la carga, transformación, incrustación, almacenamiento y recuperación de datos. El flujo de procesamiento general es el mismo que el de LlamaIndex.

Insertar descripción de la imagen aquí

Análisis del copiloto de Github

Github Copilot [39] es una herramienta de programación asistida por IA. Si lo ha usado, encontrará que Github Copilot puede ayudar a los usuarios a generar o completar código automáticamente de acuerdo con el contexto del código. A veces puede simplemente escribir el nombre de la clase o el nombre de la función, o después de escribir el comentario de la función, Copilot Te damos el código generado, y muchas veces puede ser el código que queremos implementar. Dado que Github Copilot no es de código abierto, algunas personas en Internet han realizado análisis de ingeniería inversa de su complemento VSCode, como los componentes internos del copiloto [40] y el análisis del copiloto [41] , para que podamos tener una comprensión general de los componentes internos de Copilot. implementación. En pocas palabras, el complemento Github Copilot recopilará diversa información contextual del usuario en el entorno de programación VSCode para construir un mensaje y luego enviará el mensaje construido al modelo de generación de código (como Codex) para obtener el código completo y mostrarlo en el editor. Cómo recuperar información de contexto relevante (Contexto) es un enlace muy importante. Github Copilot es una aplicación de LLM con búsqueda mejorada hacia la programación asistida por IA.

Cabe señalar que los dos análisis de ingeniería inversa mencionados anteriormente se realizaron hace unos meses. Es posible que Github Copilpot haya realizado muchas actualizaciones e iteraciones. Además, el análisis fue obtenido por el autor original después de leer y comprender el código inverso. entonces puede ser que haya algunas desviaciones en la comprensión. El siguiente contenido lo genero combinando esos dos análisis, por lo que algunos lugares pueden ser inexactos o incluso incorrectos, pero eso no nos impide usar el ejemplo de Copilot para comprender la importancia de la información contextual para mejorar los resultados de LLM y aprender. Algunas ideas prácticas para la recuperación de información sensible al contexto.

El siguiente es un ejemplo de un mensaje: puede ver que contiene información de código de prefijo (prefijo), información de código de sufijo (sufijo), modo de generación (isFimEnabled) e información de posición inicial de diferentes elementos del mensaje (promptElementRanges).

Insertar descripción de la imagen aquí

Independientemente del efecto del modelo de generación de código en sí, la calidad de la construcción del Prompt afectará en gran medida el efecto de finalización del código, y la extracción y composición de información relacionada con el contexto (Contexto) determinará en gran medida la calidad de la construcción del Prompt. Echemos un vistazo a algunas ideas clave e implementaciones de extracción de información relacionada con el contexto en la construcción Prompt de Github Copilot.

El mensaje de Copilot contiene diferentes tipos de información relacionada, incluyendo

  • BeforeCursor: Contenido antes del cursor
  • AfterCursor: Contenido después del cursor
  • SimilarFile: Fragmentos de código que son muy similares al archivo actual
  • ImportedFile: dependencia de importación
  • LanguageMarker: Etiqueta de idioma al principio del archivo
  • PathMarker: Información de ruta relativa del archivo.

Para extraer fragmentos de código similares, primero se obtendrán varios archivos a los que se haya accedido recientemente en el mismo idioma como documentos candidatos para extraer fragmentos de código similares. Luego, establezca el tamaño de la ventana (por ejemplo, el valor predeterminado es 60 líneas) y el tamaño del paso (por ejemplo, el valor predeterminado es 1 línea), y divida los documentos candidatos en bloques de código en forma de ventana deslizante. Luego calcule la similitud entre cada bloque de código segmentado y el archivo actual y, finalmente, conserve varios bloques de código con mayor similitud. Aquí, el archivo actual se obtiene interceptando el contenido del tamaño de la ventana desde el cursor actual hacia adelante. La medida de similitud utiliza el coeficiente Jaccard . Específicamente, cada línea en el bloque de código se segmenta y las palabras clave de código comunes se filtran (como si, luego, de lo contrario, para estos), obtenga un conjunto de tokens (Token), y luego podrá calcular la similitud de Jaccard entre el conjunto de tokens del bloque de código actual y el bloque de código candidato. En el escenario Copilot, este método de cálculo de similitud es simple y efectivo.
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ J(A, B) = \frac{|A \cap B|}{|A \taza B|} = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}J ( A ,B )=∣Un _segundo ∣Un _B∣ _=Un +B ∣Un _segundo ∣Un _B∣ _
El artículo de análisis anterior resume la composición de Prompt en la siguiente imagen.
Insertar descripción de la imagen aquí

Después de construir el mensaje, Copilot también determinará si es necesario iniciar una solicitud. El cálculo del modelo de generación de código requiere mucha computación, por lo que es necesario filtrar algunas solicitudes innecesarias. Uno de los juicios es utilizar un modelo de regresión lineal simple para calificar la solicitud. Cuando la puntuación es inferior a un cierto umbral, la solicitud no se enviará. Este modelo de regresión lineal utiliza características como el lenguaje de código, si la última sugerencia de finalización de código fue aceptada o rechazada, el tiempo transcurrido desde que se aceptó o rechazó la última sugerencia de finalización de código, el carácter a la izquierda del cursor, etc. Al analizar los pesos del modelo, el autor original hizo algunas observaciones:

  • Algunos lenguajes de programación tienen un peso mayor que otros lenguajes (php > js > python > rust > ...), y PHP tiene el peso más alto. Efectivamente, PHP es el mejor lenguaje del mundo ( _ ).
  • Es lógico que el medio corchete derecho (p. ej. ), ) tenga menos peso que el medio corchete izquierdo.]

A través del análisis de Github Copilot, una ayuda de programación, podemos ver:

  • Las ideas y tecnologías de LLM mejoradas con recuperación juegan un papel importante en la implementación de Github Copilot
  • La información relacionada con el contexto (Contexto) puede ser un concepto amplio, puede ser texto relacionado o fragmentos de código, o pueden ser rutas de archivos, dependencias relacionadas, etc. Cada escenario puede definir sus elementos de contexto específicos.
  • La medición de similitud y el método de recuperación de similitud pueden variar según el escenario. No todos los escenarios necesitan usar similitud de coseno. Todos necesitan encontrar documentos relevantes a través de la recuperación de similitud de vectores. Por ejemplo, en la implementación de Copilot, un coeficiente de Jaccard simple Se utiliza Calcular la similitud de los conjuntos de tokens después de la segmentación de palabras es simple y eficiente.

Búsqueda y preguntas y respuestas sobre documentos y bases de conocimiento.

Una aplicación típica de la tecnología LLM mejorada con recuperación es la base de conocimientos o preguntas y respuestas de documentos, como la recuperación y preguntas y respuestas para la base de conocimientos interna de una empresa o algunos documentos. Actualmente existen muchos productos comerciales y de código abierto en esta dirección de aplicación. Por ejemplo, Mendable [42] es un producto comercial que puede proporcionar capacidades de recuperación de IA basadas en documentos y preguntas y respuestas. Mendable proporciona las capacidades de recuperación de los documentos oficiales de los proyectos LlamaIndex y LangChain mencionados anteriormente. A continuación se muestra una captura de pantalla del uso. Puede ver que Mendable no solo dará respuestas generadas, sino que también adjuntará enlaces de referencia.

Insertar descripción de la imagen aquí

Además de los productos comerciales, también existen muchos productos similares de código abierto. Por ejemplo

  • Danswer [43] : Proporciona una función de preguntas y respuestas para documentos internos de la empresa, puede importar datos de múltiples fuentes, admite la recuperación tradicional y preguntas y respuestas basadas en LLM, y puede identificar de manera inteligente las intenciones de búsqueda de los usuarios, adoptando así diferentes estrategias de recuperación para respaldar gestión de usuarios y derechos de documentos, así como soporte para la implementación de Docker, etc.
  • PandaGPT [44] : permite a los usuarios cargar archivos y luego hacer preguntas sobre el contenido del archivo.
  • FastGPT [45] : una plataforma de preguntas y respuestas de base de conocimientos de IA basada en LLM de código abierto
  • Quivr [46] : Este proyecto de código abierto permite a los usuarios buscar y cuestionar archivos personales o bases de conocimiento, con la esperanza de convertirse en el "segundo cerebro" del usuario.
  • ChatFiles [47] : otro proyecto de código abierto de preguntas y respuestas basado en un documento de LLM

La siguiente imagen es el diagrama de arquitectura técnica del proyecto ChatFiles. Se puede encontrar que los módulos básicos y la arquitectura de dichos proyectos son muy similares. Básicamente siguen la idea de LLM con recuperación mejorada. Este tipo de base de conocimientos La aplicación de preguntas y respuestas casi se ha convertido en la aplicación Hello World en el campo LLM .

Insertar descripción de la imagen aquí

referencia

[1] Alucinaciones: https://machinelearningmastery.com/a-gentle-introduction-to-hallucinations-in-large-language-models/
[2] Una guía para la recuperación LLM aumentada: https://github.com/Wang -Shuo/A-Guide-to-Retrieval-Augmented-LLM
[3] Estado de GPT: https://www.youtube.com/watch?v=bZQun8Y4L2A&ab_channel=MicrosoftDeveloper
[4] La nueva pila de modelos de lenguaje: https:/ /www.sequoiacap.com/article/llm-stack-perspective/
[5] Arquitecturas emergentes para aplicaciones LLM: https://a16z.com/emerging-architectures-for-llm-applications/
[6] Tutorial de ACL 2023: recuperación Aplicaciones y modelos de lenguaje basados ​​en: https://acl2023-retrieval-lm.github.io/
[7] Los modelos de lenguaje grandes luchan por aprender conocimientos de cola larga: https://arxiv.org/abs/2211.08411
[8] Extracción de datos de entrenamiento de modelos de lenguaje grandes: https://arxiv.org/abs/2012.07805
[9] 100K: https://www.anthropic.com/index/100k-context-windows
[10] Perdido en el Medio: https://arxiv.org/pdf/2307.03172.pdf
[11] Estrategias de fragmentación para aplicaciones LLM: https://www.pinecone.io/learn/chunking-strategies/
[12] LangChain: https://python .langchain.com/docs/modules/data_connection/document_transformers/
[13] Cómo funciona cada índice: https://gpt-index.readthedocs.io/en/latest/core_modules/data_modules/index/index_guide.html
[14] Oración Transformadores: https://arxiv.org/abs/1908.10084
[15] text-embedding-ada-002: https://openai.com/blog/new-and-improved-embedding-model
[16] Instructor: https: //instructor-embedding.github.io/
[17] BGE: https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md
[18] Tabla de clasificación MTEB: https://huggingface.co/spaces/mteb/leaderboard
[19] ¿Realmente necesitas una base de datos vectorial: https://www.ethanrosenthal.com/2023/04/10/nn-vs-ann/
[20] Hnswlib: https://github.com/nmslib/hnswlib
[21] Faiss: https:/ /github.com/facebookresearch/faiss
[22] Índices de vecinos más cercanos para búsqueda de similitud: https://www.pinecone.io/learn/series/faiss/vector-indexes/
[23] Piña: https://www.pinecone .io/
[24] Vespa: https://vespa.ai/
[25] Weaviate: https://weaviate.io/
[26] Milvus: https://milvus.io/
[27] Croma: https:/ /www.trychroma.com/
[28] Tencent Cloud VectorDB: https://cloud.tencent.com/product/vdb
[29] ¿Qué es una base de datos vectorial?: https://www.pinecone.io/learn/vector-database/
[30] autopregunta: https://ofir.io/self-ask.pdf
[31] ReAct: https://arxiv.org/abs/2210.03629
[32] HyDE: http://boston.lti.cs.cmu.edu/luyug/HyDE/HyDE.pdf
[33] Complemento de recuperación ChatGPT: https://github. com/openai/chatgpt-retrieval-plugin
[34] Referencia: openai-chatgpt-retrieval-plugin-and-postgresql-on-azure: https://techcommunity.microsoft.com/t5/azure-database-for-postgresql /openai-chatgpt-retrieval-plugin-and-postgresql-on-azure/ba-p/3826411
[35] LlamaIndex: https://gpt-index.readthedocs.io/en/latest/index.html#
[36] Llama Hub: https://llamahub.ai/
[37] LangChain: https://python.langchain.com/docs/get_started/introduction.html
[38] Recuperación: https://python.langchain.com/docs/modules/data_connection/
[39] Copiloto de Github: https://github.com/features/copilot
[40] Partes internas del copiloto: https://thakkarparth007. github.io/copilot-explorer/posts/copilot-internals
[41] análisis de copiloto: https://github.com/mengjian-github/copilot-analysis
[42] Reparable: https://www.mendable.ai/
[ 43] Respuesta: https://github.com/danswer-ai/danswer
[44] PandaGPT: https://www.pandagpt.io/
[45] FastGPT: https://fastgpt.run/
[46] Quivr: https://github.com/StanGirard/quivr
[47] ChatFiles: https://github.com/guangzhengli/ChatFiles
[48] Bootcamp LLM de pila completa: modelos de lenguaje aumentado: https://fullstackdeeplearning.com

Supongo que te gusta

Origin blog.csdn.net/WitsMakeMen/article/details/132909291
Recomendado
Clasificación