uniflow
bietet eine einheitliche LLM-Schnittstelle zum Extrahieren und Transformieren von Rohdokumenten.
Uniflow geht zwei zentrale Herausforderungen bei der Vorbereitung von LLM-Trainingsdaten für ML-Wissenschaftler an:
Daher haben wir Uniflow entwickelt, eine einheitliche LLM-Schnittstelle zum Extrahieren und Transformieren von Rohdokumenten.
Ziel von Uniflow ist es, jedem Datenwissenschaftler dabei zu helfen, seine eigenen, datenschutzrechtlich geschützten, gebrauchsfertigen Trainingsdatensätze für die LLM-Feinabstimmung zu generieren und so die Feinabstimmung von LLMs für jedermann zugänglicher zu machen:rocket:.
Schauen Sie sich die praktischen Uniflow-Lösungen an:
Die Installation uniflow
dauert etwa 5–10 Minuten, wenn Sie die folgenden drei Schritte ausführen:
Erstellen Sie eine Conda-Umgebung auf Ihrem Terminal mit:
conda create -n uniflow python=3.10 -y
conda activate uniflow # some OS requires `source activate uniflow`
Installieren Sie den kompatiblen Pytorch basierend auf Ihrem Betriebssystem.
nvcc -V
finden. pip3 install --pre torch --index-url https://download.pytorch.org/whl/nightly/cu121 # cu121 means cuda 12.1
pip3 install torch
uniflow
installieren:
pip3 install uniflow
(Optional) Wenn Sie einen der folgenden OpenAI
-Flows ausführen, müssen Sie Ihren OpenAI-API-Schlüssel einrichten. Erstellen Sie dazu eine .env
Datei in Ihrem Root-Uniflow-Ordner. Fügen Sie dann der .env
Datei die folgende Zeile hinzu:
OPENAI_API_KEY=YOUR_API_KEY
(Optional) Wenn Sie HuggingfaceModelFlow
ausführen, müssen Sie auch die Bibliotheken transformers
, accelerate
, bitsandbytes
und scipy
installieren:
pip3 install transformers accelerate bitsandbytes scipy
(Optional) Wenn Sie LMQGModelFlow
ausführen, müssen Sie auch die Bibliotheken lmqg
und spacy
installieren:
pip3 install lmqg spacy
Herzlichen Glückwunsch, Sie haben die Installation abgeschlossen!
Wenn Sie daran interessiert sind, einen Beitrag zu uns zu leisten, finden Sie hier die vorläufigen Entwicklungsaufbauten.
conda create -n uniflow python=3.10 -y
conda activate uniflow
cd uniflow
pip3 install poetry
poetry install --no-root
Wenn Sie EC2 verwenden, können Sie eine GPU-Instanz mit der folgenden Konfiguration starten:
g4dn.xlarge
(wenn Sie ein vorab trainiertes LLM mit 7B-Parametern ausführen möchten) Wenn Sie einen der folgenden OpenAI
Flows ausführen, müssen Sie Ihren OpenAI-API-Schlüssel einrichten.
Erstellen Sie dazu eine .env
Datei in Ihrem Root-Uniflow-Ordner. Fügen Sie dann der .env
Datei die folgende Zeile hinzu:
OPENAI_API_KEY=YOUR_API_KEY
Um uniflow
zu verwenden, befolgen Sie drei Hauptschritte:
Wählen Sie eine Config
Dadurch werden das LLM und die verschiedenen konfigurierbaren Parameter bestimmt.
Konstruieren Sie Ihre Prompts
Konstruieren Sie den Kontext, den Sie als Eingabeaufforderung für Ihr Modell verwenden möchten. Sie können benutzerdefinierte Anweisungen und Beispiele mithilfe der PromptTemplate
-Klasse konfigurieren.
Führen Sie Ihren Flow
aus
Führen Sie den Flow für Ihre Eingabedaten aus und generieren Sie eine Ausgabe aus Ihrem LLM.
Hinweis: Wir erstellen derzeit auch
Preprocessing
, um die Verarbeitung von Daten aus verschiedenen Quellen wiehtml
,Markdown
und mehr zu unterstützen.
Die Config
bestimmt, welches LLM verwendet wird und wie die Eingabedaten serialisiert und deserialisiert werden. Es verfügt auch über LLM-spezifische Parameter.
Hier ist eine Tabelle der verschiedenen vordefinierten Konfigurationen, die Sie verwenden können, und der entsprechenden LLMs:
Konfig | LLM |
---|---|
Konfig | gpt-3.5-turbo-1106 |
OpenAIConfig | gpt-3.5-turbo-1106 |
HuggingfaceConfig | mistralai/Mistral-7B-Instruct-v0.1 |
LMQGConfig | lmqg/t5-base-squad-qg-ae |
Sie können jede Konfiguration mit den Standardeinstellungen ausführen oder benutzerdefinierte Parameter wie temperature
oder batch_size
an die Konfiguration für Ihren Anwendungsfall übergeben. Weitere Einzelheiten finden Sie im Abschnitt zur erweiterten benutzerdefinierten Konfiguration.
Standardmäßig ist uniflow
so eingerichtet, dass es Fragen und Antworten basierend auf dem von Ihnen übergebenen Context
generiert. Zu diesem Zweck verfügt es über eine Standardanweisung und wenige Beispiele, die es als Leitfaden für das LLM verwendet.
Hier ist die Standardanweisung:
Generate one question and its corresponding answer based on the last context in the last example. Follow the format of the examples below to include context, question, and answer in the response
Hier sind die Standardbeispiele für wenige Aufnahmen:
context="The quick brown fox jumps over the lazy brown dog.",
question="What is the color of the fox?",
answer="brown."
context="The quick brown fox jumps over the lazy black dog.",
question="What is the color of the dog?",
answer="black."
Um diese Standardanweisungen und Beispiele auszuführen, müssen Sie lediglich eine Liste von Context
an den Flow übergeben. uniflow
generiert dann eine benutzerdefinierte Eingabeaufforderung mit den Anweisungen und wenigen Beispielen für jedes Context
, das an das LLM gesendet werden soll. Weitere Einzelheiten finden Sie im Abschnitt „Ausführen des Flows“.
Die Context
Klasse wird verwendet, um den Kontext für die LLM-Eingabeaufforderung zu übergeben. Ein Context
besteht aus einer context
, bei der es sich um eine Textzeichenfolge handelt.
Um uniflow
mit den Standardanweisungen und wenigen Beispielen auszuführen, können Sie eine Liste von Context
an den Flow übergeben. Zum Beispiel:
from uniflow.op.prompt import Context
data = [
Context(
context="The quick brown fox jumps over the lazy brown dog.",
),
...
]
client.run(data)
Eine detailliertere Übersicht über die Ausführung des Flows finden Sie im Abschnitt Ausführen des Flows.
Wenn Sie mit einer benutzerdefinierten Eingabeaufforderungsanweisung oder wenigen Beispielen ausführen möchten, können Sie das PromptTemplate
Objekt verwenden. Es verfügt über instruction
und example
.
Eigentum | Typ | Beschreibung |
---|---|---|
instruction | str | Ausführliche Anleitung zum LLM |
examples | Liste[Kontext] | Die Beispiele mit wenigen Schüssen. |
Sie können bei Bedarf alle Standardeinstellungen überschreiben.
Um ein Beispiel dafür zu sehen, wie Sie PromptTemplate
verwenden, um uniflow
mit einer benutzerdefinierten instruction
, wenigen Beispielen und benutzerdefinierten Context
zum Generieren einer Zusammenfassung auszuführen, sehen Sie sich das Notizbuch openai_pdf_source_10k_summary an
Sobald Sie sich für Ihre Config
und Eingabeaufforderungsstrategie entschieden haben, können Sie den Flow für die Eingabedaten ausführen.
Importieren Sie die uniflow
Objekte Client
, Config
und Context
.
from uniflow.flow.client import TransformClient
from uniflow.flow.config import TransformOpenAIConfig, OpenAIModelConfig
from uniflow.op.prompt import Context
Verarbeiten Sie Ihre Daten in Blöcken vor, um sie an den Flow weiterzugeben. In Zukunft werden wir Preprocessing
haben, die Sie bei diesem Schritt unterstützen. Im Moment können Sie jedoch eine Bibliothek Ihrer Wahl wie pypdf verwenden, um Ihre Daten aufzuteilen.
raw_input_context = ["It was a sunny day and the sky color is blue.", "My name is bobby and I am a talent software engineer working on AI/ML."]
Erstellen Sie eine Liste von Context
, um Ihre Daten an den Fluss zu übergeben.
data = [
Context(context=c)
for c in raw_input_context
]
[Optional] Wenn Sie eine benutzerdefinierte Anleitung und/oder Beispiele verwenden möchten, erstellen Sie eine PromptTemplate
.
from uniflow.op.prompt import PromptTemplate
guided_prompt = PromptTemplate(
instruction="Generate a one sentence summary based on the last context below. Follow the format of the examples below to include context and summary in the response",
few_shot_prompt=[
Context(
context="When you're operating on the maker's schedule, meetings are a disaster. A single meeting can blow a whole afternoon, by breaking it into two pieces each too small to do anything hard in. Plus you have to remember to go to the meeting. That's no problem for someone on the manager's schedule. There's always something coming on the next hour; the only question is what. But when someone on the maker's schedule has a meeting, they have to think about it.",
summary="Meetings disrupt the productivity of those following a maker's schedule, dividing their time into impractical segments, while those on a manager's schedule are accustomed to a continuous flow of tasks.",
),
],
)
Erstellen Sie ein Config
-Objekt zur Übergabe an das Client
-Objekt.
config = TransformOpenAIConfig(
prompt_template=guided_prompt,
model_config=OpenAIModelConfig(
response_format={"type": "json_object"}
),
)
client = TransformClient(config)
Verwenden Sie das client
, um den Flow für die Eingabedaten auszuführen.
output = client.run(data)
Verarbeiten Sie die Ausgabedaten. Standardmäßig ist die LLM-Ausgabe eine Liste von Ausgabedikten, eines für jeden an den Fluss übergebenen Context
. Jedes Diktat verfügt über eine response
, die die LLM-Antwort sowie etwaige Fehler enthält. Beispielsweise würde output[0]['output'][0]
so aussehen:
{
'response': [{'context': 'It was a sunny day and the sky color is blue.',
'question': 'What was the color of the sky?',
'answer': 'blue.'}],
'error': 'No errors.'
}
Weitere Beispiele finden Sie im Beispielordner.
Sie können die Abläufe auch konfigurieren, indem Sie benutzerdefinierte Konfigurationen oder Argumente an das Config
-Objekt übergeben, wenn Sie bestimmte Parameter wie das LLM-Modell, die Anzahl der Threads, die Temperatur und mehr weiter optimieren möchten.
Jede Konfiguration hat die folgenden Parameter:
Parameter | Typ | Beschreibung |
---|---|---|
prompt_template | PromptTemplate | Die Vorlage, die für die geführte Eingabeaufforderung verwendet werden soll. |
num_threads | int | Die Anzahl der Threads, die für den Flow verwendet werden sollen. |
model_config | ModelConfig | Die Konfiguration, die an das Modell übergeben werden soll. |
Sie können die model_config
weiter konfigurieren, indem Sie eine der Model Configs
mit benutzerdefinierten Parametern übergeben.
Die Modellkonfiguration ist eine Konfiguration, die an das Config
übergeben wird und bestimmt, welches LLM-Modell verwendet wird, und über Parameter verfügt, die für das LLM-Modell spezifisch sind.
Die Basiskonfiguration heißt ModelConfig
und hat die folgenden Parameter:
Parameter | Typ | Standard | Beschreibung |
---|---|---|---|
model_name | str | gpt-3.5-turbo-1106 | OpenAI-Site |
Die OpenAIModelConfig
erbt von der ModelConfig
und verfügt über die folgenden zusätzlichen Parameter:
Parameter | Typ | Standard | Beschreibung |
---|---|---|---|
num_calls | int | 1 | Die Anzahl der Aufrufe an die OpenAI-API. |
temperature | schweben | 1.5 | Die für die OpenAI-API zu verwendende Temperatur. |
response_format | Diktieren[str, str] | {"Typ": "Text"} | Das für die OpenAI-API zu verwendende Antwortformat. Kann „Text“ oder „JSON“ sein |
Die HuggingfaceModelConfig
erbt von der ModelConfig
, überschreibt jedoch den Parameter model_name
um standardmäßig das Modell mistralai/Mistral-7B-Instruct-v0.1
zu verwenden.
Parameter | Typ | Standard | Beschreibung |
---|---|---|---|
model_name | str | mistralai/Mistral-7B-Instruct-v0.1 | Hugging Face-Site |
batch_size | int | 1 | Die für die Hugging Face API zu verwendende Batchgröße. |
Die LMQGModelConfig
erbt von der ModelConfig
, überschreibt jedoch den Parameter model_name
um standardmäßig das Modell lmqg/t5-base-squad-qg-ae
zu verwenden.
Parameter | Typ | Standard | Beschreibung |
---|---|---|---|
model_name | str | lmqg/t5-base-squad-qg-ae | Hugging Face-Website |
batch_size | int | 1 | Die für die LMQG-API zu verwendende Batchgröße. |
Hier ist ein Beispiel für die Übergabe einer benutzerdefinierten Konfiguration an das Client
-Objekt:
from uniflow.flow.client import TransformClient
from uniflow.flow.config import TransformOpenAIConfig, OpenAIModelConfig
from uniflow.op.prompt import Context
contexts = ["It was a sunny day and the sky color is blue.", "My name is bobby and I am a talent software engineer working on AI/ML."]
data = [
Context(
context=c
)
for c in contexts
]
config = OpenAIConfig(
num_threads=2,
model_config=OpenAIModelConfig(
model_name="gpt-4",
num_calls=2,
temperature=0.5,
),
)
client = TransformClient(config)
output = client.run(data)
Wie Sie sehen können, übergeben wir entsprechend unseren Anforderungen benutzerdefinierte Parameter an die OpenAIModelConfig
OpenAIConfig
Konfigurationen.