BUG: PlagiarismScorer accepts invalid n-gram size and blank reference text
Maintainer antworten meist innerhalb von 2 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 85/100
Rechercherichtung
Beginne in pyrit/score/float_scale/plagiarism_scorer.py bei PlagiarismScorer.init und vergleiche anschließend die Behandlung der Parameter mit der in der Issue beschriebenen Validierung von ApproximateTextMatching. Führe die vorhandenen PlagiarismScorer-Tests aus und ergänze Abdeckung für ungültiges n, leeren Referenztext und ungültige Metriken; als erledigt gilt die Aufgabe, wenn die Konstruktion jeden aufgeführten Fall ablehnt, ohne die gültige Bewertung zu ändern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
PlagiarismScorer does not validate its n (n-gram size) or reference_text parameters during initialization.
-
n <= 0creates false-positive 100% plagiarism matches:
Whenn = 0,_ngram_setreturns{()}(an empty tuple). InPlagiarismMetric.JACCARD,len(ref_ngrams & res_ngrams) / len(ref_ngrams)evaluates to1 / 1 = 1.0for any response. A completely unrelated prompt response is therefore reported as 100% plagiarized.
Whenn < 0(e.g.n = -1), negative slicing produces spurious n-grams and invalid partial overlap scores (e.g.0.5).
Whennis a non-integer float (e.g.2.5), construction succeeds, but scoring later crashes withTypeError: 'float' object cannot be interpreted as an integer.
Whennis a boolean (e.g.False), it evaluates as0and yields the same false-positive1.0. -
Empty or whitespace-only
reference_textsilently reports0.0for all responses:
Whenreference_textis""or whitespace-only" ",_tokenize(reference)produces[](reference_len = 0). The conditionresponse_len == 0 or reference_len == 0causes_plagiarism_scoreto silently return0.0for every response, even when the response is identical to the reference text. A static misconfiguration is thus silently swallowed and reported as non-plagiarism.
The sibling class in analytics, ApproximateTextMatching, already validates that its n-gram parameter n must be an integer >= 1.
Steps/Code to Reproduce
from pyrit.score import PlagiarismScorer, PlagiarismMetric
# 1. n=0 scores 1.0 (100% match) for completely unrelated text
scorer = PlagiarismScorer(
reference_text="The quick brown fox jumps over the lazy dog",
metric=PlagiarismMetric.JACCARD,
n=0,
)
score = scorer._plagiarism_score(
response="Completely unrelated content about astrophysics and quantum mechanics",
reference="The quick brown fox jumps over the lazy dog",
metric=PlagiarismMetric.JACCARD,
n=0,
)
print("Score with n=0:", score)
# 2. n=-1 yields spurious partial match
print(
"Score with n=-1:",
scorer._plagiarism_score(
response="Completely unrelated content",
reference="The quick brown fox jumps over the lazy dog",
metric=PlagiarismMetric.JACCARD,
n=-1,
),
)
# 3. Empty reference_text silently evaluates every response as 0.0
empty_scorer = PlagiarismScorer(reference_text="", metric=PlagiarismMetric.LCS)
print("Score with empty reference:", empty_scorer._plagiarism_score(response="", reference=""))
Expected Results
PlagiarismScorer.__init__ should validate parameters at construction time and raise ValueError:
reference_textmust be a non-empty string containing at least one word token.nmust be an integer>= 1(rejecting0, negative values, booleans, and non-integers).metricmust be an instance ofPlagiarismMetric.
Actual Results
Score with n=0: 1.0
Score with n=-1: 0.5
Score with empty reference: 0.0
PlagiarismScorer.__init__ assigns self.reference_text = reference_text and self.n = n directly at pyrit/score/float_scale/plagiarism_scorer.py:54-56 without validation.
Versions
- OS: Windows 11
- Python: 3.14
- PyRIT:
mainatc2ae5eeb
- Vorherrschende Sprache
- Python
- Sterne
- 4.6k
- Forks
- 924
- Ø Merge
- 2 T. 18 Std.
- Gemergte PRs (30 T.)
- 251
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Kein Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus microsoft/PyRIT
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
Maintainer antworten meist innerhalb von 2 Tagen
-
PackageHallucinationScorer (Python) misses `from pkg.sub import x` and indented importsEvtl. vergeben @barry166 hat das vor 6 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
microsoft/PyRIT#2948 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
BUG Configuration keeps runtime-status errors after polling recoversEvtl. vergeben @rupayon123 hat das vor 12 Tagen übernommen. OffenBug: triage GUI help wanted
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
microsoft/PyRIT#2868 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
ObjectiveScorerEvaluator scores every conversation message as an assistant responseEvtl. vergeben @feiiiiii5 hat das vor 13 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 2 Tagen
-
feature-request
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in microsoft/PyRIT
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
rpm-software-management/mock#1824 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
jpata/particleflow#520 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug good first issue hacktoberfest
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
gridhead/gi-loadouts#699 ·
Maintainer antworten meist innerhalb von 13 Tagen
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 86/100
FinanceFlash/unvibecode#206 ·
Maintainer antworten meist innerhalb von 1 Tag