BUG: PlagiarismScorer accepts invalid n-gram size and blank reference text
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 85/100
Direzione di ricerca
Inizia in pyrit/score/float_scale/plagiarism_scorer.py, in PlagiarismScorer.init, quindi confronta la gestione dei parametri con la validazione di ApproximateTextMatching descritta nell’issue. Esegui i test esistenti di PlagiarismScorer e aggiungi la copertura per n non valido, testo di riferimento vuoto e metriche non valide; il lavoro è completo quando la costruzione rifiuta ciascun caso elencato senza modificare il punteggio valido.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
- Lingua principale
- Python
- Stelle
- 4.6k
- Fork
- 924
- Merge medio
- 2g 14h
- PR unite (30g)
- 227
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/PyRIT
-
PackageHallucinationScorer (Python) misses `from pkg.sub import x` and indented importsForse già presa @barry166 l’ha presa 4 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
microsoft/PyRIT#2948 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
LiteLLMChatTarget does not flag or survive output-token truncationForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 2 giorni
-
BUG Configuration keeps runtime-status errors after polling recoversForse già presa @rupayon123 l’ha presa 10 giorni fa. ApertaBug: triage GUI help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
microsoft/PyRIT#2868 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
ObjectiveScorerEvaluator scores every conversation message as an assistant responseForse già presa @feiiiiii5 l’ha presa 11 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 2 giorni
-
BUG: BinAsciiConverter identifiers collide for different word-selection indicesForse già presa @LE0-Lin l’ha presa 1 giorno fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 62/100
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di microsoft/PyRIT
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
Juniper/ansible-junos-stdlib#904 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
pollen-robotics/reachy_mini#1457 ·
I maintainer di solito rispondono entro 1 giorno
-
area:runtime good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
WATonomous/wato_f1tenth#39 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
FireDynamics/fdsreader#123 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100