
SimilitySearchKit es un paquete Swift que permite incrustaciones de texto en el dispositivo y funcionalidad de búsqueda semántica para aplicaciones iOS y MacOS en solo unas pocas líneas. Enfatizando la velocidad, la extensibilidad y la privacidad, admite una variedad de modelos PNL de última generación y métricas de similitud, además de la integración perfecta para las opciones de traer su propia.

Algunos casos de uso potenciales para SimilitySearchKit incluyen:
Motores de búsqueda de documentos centrados en la privacidad: cree un motor de búsqueda que procese documentos confidenciales localmente, sin exponer los datos del usuario a servicios externos. (Consulte el proyecto de ejemplo "ChatWithFilesExample" en el directorio de ejemplos).
Sistemas de respuesta de pregunta fuera de línea: Implemente un sistema de respuesta de pregunta que encuentre las respuestas más relevantes a la consulta de un usuario dentro de un conjunto de datos local.
Documentos de clúster y motores de recomendación: agrupe automáticamente y organice documentos basados en su contenido textual en el borde.
Al aprovechar SimilitySearchKit , los desarrolladores pueden crear fácilmente aplicaciones poderosas que mantienen datos cerca de casa sin las principales compensaciones en funcionalidad o rendimiento.
Para instalar SimilitySearchKit , simplemente agréguelo como una dependencia a su proyecto Swift utilizando el Swift Package Manager. Recomiendo usar el método Xcode personalmente a través de:
File → Add Packages... → Search or Enter Package Url → https://github.com/ZachNagengast/similarity-search-kit.git
Xcode debe brindarle las siguientes opciones para elegir qué modelo le gustaría agregar (consulte los modelos disponibles a continuación para la elección de la ayuda):

Si desea agregarlo a través de Package.swift , agregue la siguiente línea a su matriz de dependencias:
. package ( url : " https://github.com/ZachNagengast/similarity-search-kit.git " , from : " 0.0.1 " )Luego, agregue la dependencia del objetivo apropiado al objetivo deseado:
. target ( name : " YourTarget " , dependencies : [
" SimilaritySearchKit " ,
" SimilaritySearchKitDistilbert " ,
" SimilaritySearchKitMiniLMMultiQA " ,
" SimilaritySearchKitMiniLMAll "
] )Si solo desea utilizar un subconjunto de los modelos disponibles, puede omitir la dependencia correspondiente. Esto reducirá el tamaño de su binario final.
Para usar SimilitySearchKit en su proyecto, primero importe el marco:
import SimilaritySearchKitA continuación, cree una instancia de similitudindex con su métrica de distancia deseada y modelo de incrustación (ver más abajo para opciones):
let similarityIndex = await SimilarityIndex (
model : NativeEmbeddings ( ) ,
metric : CosineSimilarity ( )
)Luego, agregue su texto que desea hacer que se pueda buscar al índice:
await similarityIndex . addItem (
id : " id1 " ,
text : " Metal was released in June 2014. " ,
metadata : [ " source " : " example.pdf " ]
)Finalmente, consulte el índice de los elementos más similares a una consulta dada:
let results = await similarityIndex . search ( " When was metal released? " )
print ( results ) Que genera una matriz de SearchResult : [SearchResult(id: "id1", score: 0.86216, metadata: ["source": "example.pdf"])]
El directorio Examples contiene aplicaciones Multple Sample y MacOS que demuestra cómo usar SimilitySearchKit en su máxima extensión.
| Ejemplo | Descripción | Requisitos |
|---|---|---|
BasicExample | Una aplicación multiplataforma básica que indexa y compara la similitud de un pequeño conjunto de cadenas codificadas. | iOS 16.0+, macOS 13.0+ |
PDFExample | Una aplicación Mac-catalyst que permite la búsqueda semántica en el contenido de archivos PDF individuales. | iOS 16.0+ |
ChatWithFilesExample | Una aplicación MacOS avanzada que indexa cualquiera de los archivos de texto en su computadora. | macOS 13.0+ |
| Modelo | Caso de uso | Tamaño | Fuente |
|---|---|---|---|
NaturalLanguage | Similitud de texto, inferencia más rápida | Incorporado | Manzana |
MiniLMAll | Similitud de texto, inferencia más rápida | 46 MB | Cara de abrazo |
Distilbert | Preguntas y preguntas y respuestas, mayor precisión | 86 MB (cuantificado) | Cara de abrazo |
MiniLMMultiQA | Preguntas y preguntas y respuestas, inferencia más rápida | 46 MB | Cara de abrazo |
Los modelos conforman el EmbeddingProtocol y se pueden usar indistintamente con la clase SimilarityIndex .
Se puede encontrar una pequeña pero creciente lista de modelos previamente convertidos en este repositorio en Huggingface. Si tiene un modelo que le gustaría ver a la lista, abra un problema o envíe una solicitud de extracción.
| Métrico | Descripción |
|---|---|
DotProduct | Mide la similitud entre dos vectores como producto de sus magnitudes |
CosineSimilarity | Calcula la similitud midiendo el coseno del ángulo entre dos vectores |
EuclideanDistance | Calcula la distancia de línea recta entre dos puntos en el espacio euclidiano |
Las métricas se ajustan al DistanceMetricProtocol y se pueden usar indistintamente con la clase SimilarityIndex .
Todas las partes principales del SimilarityIndex se pueden anular con implementaciones personalizadas que se ajustan a los siguientes protocolos:
Acepta una cadena y devuelve una matriz de carrozas que representan la incrustación del texto de entrada.
func encode ( sentence : String ) async -> [ Float ] ?Acepta un vector de incrustación de consulta y una lista de vectores de incrustaciones y devuelve una tupla de la puntuación métrica de distancia y el índice del vecino más cercano.
func findNearest ( for queryEmbedding : [ Float ] , in neighborEmbeddings : [ [ Float ] ] , resultsCount : Int ) -> [ ( Float , Int ) ]Divide una cuerda en trozos de un tamaño dado, con una superposición dada. Esto es útil para dividir documentos largos en trozos más pequeños para la incrustación. Devuelve la lista de fragmentos y una lista opcional de tokensids para cada fragmento.
func split ( text : String , chunkSize : Int , overlapSize : Int ) -> ( [ String ] , [ [ String ] ] ? )Tokeniza y se contradita texto. Use esto para modelos personalizados que usan diferentes tokenizers que los que están disponibles en la lista actual.
func tokenize ( text : String ) -> [ String ]
func detokenize ( tokens : [ String ] ) -> StringGuardar y cargar elementos de índice. La implementación predeterminada utiliza archivos JSON, pero esto se puede anular para usar cualquier mecanismo de almacenamiento.
func saveIndex ( items : [ IndexItem ] , to url : URL , as name : String ) throws -> URL
func loadIndex ( from url : URL ) throws -> [ IndexItem ]
func listIndexes ( at url : URL ) -> [ URL ] Muchas partes de este proyecto se derivaron del código existente, ya sea en Swift, o se tradujeron en Swift gracias a ChatGPT. Estos son algunos de los principales proyectos a los que se hace referencia:
Este proyecto se ha inspirado en los increíbles avances en los servicios y aplicaciones de lenguaje natural que se han producido con el surgimiento de ChatGPT. Si bien estos servicios han desbloqueado un mundo completamente nuevo de poderosas aplicaciones basadas en texto, a menudo dependen de los servicios en la nube. Específicamente, muchos servicios de "chatear con datos" requieren que los usuarios carguen sus datos en servidores remotos para su procesamiento y almacenamiento. Aunque esto funciona para algunos, podría no ser el mejor ajuste para aquellos en entornos de baja conectividad, o manejar información confidencial o confidencial. Si bien Apple tiene una biblioteca NaturalLanguage de biblioteca para tareas similares, el proceso de conversión del modelo de CorEML abre una gama mucho más amplia de modelos y casos de uso. Con esto en mente, SimilitySearchKit tiene como objetivo proporcionar una solución robusta en el dispositivo que permita a los desarrolladores crear aplicaciones de PNL de última generación dentro del ecosistema de Apple.
Aquí hay una breve lista de algunas características que se planean para futuras versiones:
Tengo curiosidad por ver cómo las personas usan esta biblioteca y qué otras características serían útiles, así que no dude en comunicarse con Twitter @zachnagengast o por correo electrónico ZnagenGast (AT) Gmail (DOT) Com.