Skip to content

Commit

Permalink
multi-party 🥳
Browse files Browse the repository at this point in the history
  • Loading branch information
nor0x committed Sep 9, 2024
1 parent 13d3955 commit 00c0465
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 121 deletions.
8 changes: 8 additions & 0 deletions WahlGPT.Common/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,19 @@ public static IKernelMemory BuildKernelMemory()
TextModel = TextModel,
};

var azureBlobStorageConfig = new AzureBlobsConfig
{
Auth = AzureBlobsConfig.AuthTypes.ConnectionString,
ConnectionString = BlobConnectionString,
Container = "wahlgpt"
};

#pragma warning disable KMEXP00 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
var kernelMemory = new KernelMemoryBuilder()
.WithContentDecoder(new TextDecoder())
.WithOpenAITextEmbeddingGeneration(embeddingConfig)
.WithOpenAITextGeneration(generationConfig)
.WithAzureBlobsDocumentStorage(azureBlobStorageConfig)
.WithSearchClientConfig(new SearchClientConfig
{
Temperature = 0.7,
Expand Down
156 changes: 86 additions & 70 deletions WahlGPT.Web/Pages/Home.razor
Original file line number Diff line number Diff line change
Expand Up @@ -47,44 +47,49 @@
<!-- One -->
<section id="one" class="main style1">
<div class="container">
<header class="major">
<h2>
@_question
</h2>
</header>
@if (_waitingForAnswer)
{
<div class="answer-loader">
<span></span>
<span></span>
<span></span>
</div>
}
<div class="row gtr-150 answer-row">
<div class="col-6 col-12-medium">
<header class="major">
<h2>
@_question
@if (_answers is not null)
{

@foreach (var answer in _answers.OrderByDescending(a => _parties.First(p => p.party == a.party).order))
{

<div class="col-6 col-12-medium">
<span class="selected-party-badge">
@_parties.FirstOrDefault(p => p.selected).party
@answer.party
</span>
</h2>
</header>
@if (_waitingForAnswer)
{
<div class="answer-loader">
<span></span>
<span></span>
<span></span>
<p>@((MarkupString)ChatManager.ConvertToHtml(answer.answer))</p>
<div class="answer-spacer"></div>
</div>
}
else
{
<p>@((MarkupString)ChatManager.ConvertToHtml(_answer))</p>
}
</div>
<div class="col-6 col-12-medium imp-medium">
<header class="major">
<h2>
Quellen:
</h2>
</header>
@if (_citations is not null)
{
<section class="accordion">
@foreach (var citation in _citations)
<div class="col-6 col-12-medium imp-medium">
<header class="major">
<h3>
Quellen:
</h3>
</header>
@if (answer.source?.Partitions is not null)
{
<section class="accordion">

@foreach (var citation in answer.source.Partitions.Take(3))
{
<div class="tab">
<input type="checkbox" name="accordion-1" id="[email protected]">
<label for="[email protected]" class="tab__label">
@_sourceName -
<label for="[email protected]" class="tab__label">
@(answer.party.ToLower() + ".pdf") -
Relevanz: @citation.Relevance.ToString("P", CultureInfo.InvariantCulture)
- zuletzt aktualisiert:
@citation.LastUpdate.ToString("dd'.'MM'.'yyyy", CultureInfo.InvariantCulture)
Expand All @@ -93,23 +98,32 @@
<p><i>@citation.Text</i></p>
</div>
</div>
}
}

</section>
}
@if (!string.IsNullOrEmpty(_downloadUrl))
{
<p>
Wahlprogamm herunterladen: <a href="@_downloadUrl" target="_blank">
@_downloadUrl.Split("/").Last();
</a>
</p>
</section>
}
else
{
<p>Keine Quellen gefunden.</p>
}



@if (!string.IsNullOrEmpty(_downloadUrl))
{
<p>
Wahlprogamm herunterladen: <a href="@GetDownloadUrl(answer.party)" target="_blank">
@GetDownloadUrl(answer.party).Split("/").LastOrDefault()
</a>
</p>
}
</div>
}
</div>
}
</div>
</div>
<p class="answer-info-text">
Diese Antwort wurde mittels Retrieval-Augmented Generation (RAG) und einem Large-Language Model (LLM) erstellt. Diese Technologien kombinieren die Fähigkeit, relevante Daten aus verschiedenen Quellen abzurufen, und mittels Textgenerierung Zusammenfassungen zu erstellen. Bitte berücksichtige, dass die Möglichkeit von Fehlern oder Ungenauigkeiten besteht.
Diese Antworten wurde mittels Retrieval-Augmented Generation (RAG) und einem Large-Language Model (LLM) erstellt. Diese Technologien kombinieren die Fähigkeit, relevante Daten aus verschiedenen Quellen abzurufen, und mittels Textgenerierung Zusammenfassungen zu erstellen. Bitte berücksichtige, dass die Möglichkeit von Fehlern oder Ungenauigkeiten besteht.
</p>
</section>

Expand All @@ -135,7 +149,7 @@
<strong>Antwortgenerierung (Augmented Generation):</strong> Das LLM verarbeitet die gefundenen Informationen und formuliert eine verständliche Antwort.
</p>
<p>Durch diese Kombination von Suche und Textgenerierung kann das LLM präzise und nützliche Antworten auf deine Fragen zu Wahlprogrammen geben. Du erhältst schnell klare Informationen, ohne die gesamten Texte selbst durchsuchen zu müssen.</p>
<p>der Code von WahlGPT ist open-source und auf <strong><a class="content-link-a" href="https://github.com/nor0x/wahlgpt" target="_blank">GitHub</a></strong> verfügbar.</p>
<p>der Code von WahlGPT ist open-source und auf <strong><a class="content-link-a" href="https://github.com/nor0x/wahlgpt" target="_blank">GitHub</a></strong> verfügbar. Dort können auch alle <a class="content-link-a" href="https://github.com/nor0x/wahlgpt/tree/main/WahlGPT.Importer/Documents">Wahlprogramme</a> die als Import verwendet heruntergeladen werden.</p>
</div>
</div>
</div>
Expand All @@ -147,7 +161,8 @@
<header class="major">
<h2>Support?</h2>
</header>
<p class="support-text">jede Antwort die von WahlGPT generiert wird, kostet Geld.<br/> Wenn du das Projekt unterstützen möchtest, kannst du das hier tun.
<p class="support-text">
jede Antwort die von WahlGPT generiert wird, kostet Geld.<br /> Wenn du das Projekt unterstützen möchtest, kannst du das hier tun.
</p>
<ul class="actions special">
<li><a href="https://bento.me/nor0x" target="_blank" class="button wide primary">Unterstützen!</a></li>
Expand Down Expand Up @@ -193,10 +208,8 @@
@code
{
private string? _question;
private List<Citation.Partition>? _citations;
private string? _sourceName;
private string? _downloadUrl;

Check warning on line 211 in WahlGPT.Web/Pages/Home.razor

View workflow job for this annotation

GitHub Actions / deploy-to-github-pages

Field 'Home._downloadUrl' is never assigned to, and will always have its default value null
private string? _answer;
private List<(string answer, string party, Citation source)> _answers;

Check warning on line 212 in WahlGPT.Web/Pages/Home.razor

View workflow job for this annotation

GitHub Actions / deploy-to-github-pages

Non-nullable field '_answers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.
private bool _waitingForAnswer;
private bool _buttonDisabled = true;
List<(string party, string documentId, bool selected, int order)> _parties = new List<(string party, string documentId, bool
Expand Down Expand Up @@ -225,35 +238,35 @@
{
try
{
_answer = null;
_citations = null;
_answers = new();
if (string.IsNullOrEmpty(_question))
{
return;
}
//check if a party is selected
if (!_parties.Any(p => p.selected))
{
return;
}

//enable button only if upper conditions are met
//smooth scroll to #one
_waitingForAnswer = true;
await _js.InvokeVoidAsync("scrollToElement", "#one");
var answer = await _chat.AskQuestion(_question, _parties.Where(p => p.selected).Select(p => p.documentId).ToList());
_waitingForAnswer = false;
if (answer is null)
{
_answer = "Sorry, ich konnte keine Antwort finden.";
}
else
foreach (var p in _parties.Where(p => p.selected))
{
_answer = answer.Result;
_sourceName = answer.RelevantSources.FirstOrDefault()?.SourceName ?? "";
_citations = answer.RelevantSources.FirstOrDefault().Partitions?.Take(3).ToList() ?? null;
var answer = await _chat.AskQuestion(_question, new List<string> { p.documentId });
if (answer is null)
{
_answers.Add(("Sorry, ich konnte keine Antwort finden.", p.party, null));

Check warning on line 257 in WahlGPT.Web/Pages/Home.razor

View workflow job for this annotation

GitHub Actions / deploy-to-github-pages

Argument of type '(string, string party, Citation?)' cannot be used for parameter 'item' of type '(string answer, string party, Citation source)' in 'void List<(string answer, string party, Citation source)>.Add((string answer, string party, Citation source) item)' due to differences in the nullability of reference types.
}
else
{
_answers.Add((answer.Result, p.party, answer.RelevantSources.FirstOrDefault()));

Check warning on line 261 in WahlGPT.Web/Pages/Home.razor

View workflow job for this annotation

GitHub Actions / deploy-to-github-pages

Argument of type '(string Result, string party, Citation?)' cannot be used for parameter 'item' of type '(string answer, string party, Citation source)' in 'void List<(string answer, string party, Citation source)>.Add((string answer, string party, Citation source) item)' due to differences in the nullability of reference types.
}

_answers = _answers.OrderBy(a => _parties.First(p => p.party == a.party).order).ToList();
StateHasChanged();

}

_waitingForAnswer = false;
StateHasChanged();
}
catch (Exception e)
Expand All @@ -264,15 +277,18 @@

void SelectParty(string party)
{
_parties = _parties.Select(p => (p.party, p.documentId, false, p.order)).ToList();
var index = _parties.FindIndex(p => p.party == party);
_parties[index] = (party, _parties[index].documentId, true, _parties[index].order);
_downloadUrl = $"https://raw.githubusercontent.com/nor0x/wahlgpt/main/WahlGPT.Importer/Documents/{_parties[index].documentId}.pdf";

_parties = _parties.Select(p => p.party == party ? (p.party, p.documentId, !p.selected, p.order) : p).ToList();

_buttonDisabled = string.IsNullOrEmpty(_question) || !_parties.Any(p => p.selected);
StateHasChanged();
}

string GetDownloadUrl(string party)
{
var documentId = _parties.First(p => p.party == party).documentId;
return $"https://raw.githubusercontent.com/nor0x/wahlgpt/main/WahlGPT.Importer/Documents/{documentId}.pdf";
}

private async void CopyEmailToClipboard()
{
await _js.InvokeVoidAsync("copyToClipboard", "[email protected]");
Expand Down
Loading

0 comments on commit 00c0465

Please sign in to comment.