Research Question
Is it possible to identify which LLM generated a response by analyzing its semantic patterns across multiple standardized prompts?
Approach
LLM Fingerprint uses semantic similarity patterns across multiple prompts to create model-specific "fingerprints":
-
Fingerprint Creation: Generate multiple responses from known LLMs using standardized prompts
- Fixed sampling parameters to ensure consistent sampling behavior
- Multiple response samples per prompt to account for sampling variance
- Several distinct prompts to capture model characteristics
-
Similarity Analysis: Measure semantic similarity within and between prompt response groups
- Within-prompt similarity reveals consistency characteristics
- Cross-prompt similarity patterns create a unique model signature
-
Model Identification: Match patterns from unknown models against the fingerprint database
- Generate responses from the unknown model using the same standardized prompts
- Compare similarity patterns with known models
- Identify the closest matching fingerprint
Usage
Set required environment variables. See .envrc.example for more details.
Creating Model Fingerprints
# Generate samples for known model responses
llm-fingerprint generate \
--language-model "model-1" "model-2" "model-3" \
--prompts-path "./data/prompts/prompts_general_v1.jsonl" \
--samples-path "samples.jsonl" \
--samples-num 4
# Upload samples to ChromaDB
llm-fingerprint upload \
--language-model "embedding-model" \
--samples-path "samples.jsonl" \
--collection-name "samples"
Identifying Unknown Models
# Generate samples for unknown model (or use an external service)
# Let's suppose the we don't know we are using model-2
llm-fingerprint generate \
--language-model "model-2" \
--prompts-path "./data/prompts/prompts_single_v1.jsonl" \
--samples-path "unk-samples.jsonl" \
--samples-num 1
# Query ChromaDB for model identification
llm-fingerprint query \
--language-model "embedding-model" \
--samples-path "unk-samples.jsonl" \
--results-path "results.jsonl" \
--results-num 2
# matches.jsonl will contain the results
# {"model": "model-2", "score": ... }
# {"model": "model-1", "score": ... }
Installation
The preferred way to install llm-fingerprint is using uv (although you can also use pip).
# Clone the repository
git clone https://github.com/S1M0N38/llm-fingerprint.git
cd llm-fingerprint
# Create a virtual environment
uv venv
# Install the package
uv sync # --all-groups # for installing ml and dev groups
Requirements
- Python 3.11+
- OpenAI-compatible API endpoints (
/chat/completionsand/embeddings) - Access to ChromaDB (locally or hosted)
Contributing
This toy/research project is still in its early stages, and I welcome any feedback, suggestions, and contributions! If you're interested in discussing ideas or have questions about the approach, please start a conversation in GitHub Discussions.
For detailed information on setting up your development environment, understanding the project structure, and the contribution workflow, please refer to CONTRIBUTING.md.
Metadata
Release files for llm_fingerprint 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| llm_fingerprint-0.7.0.tar.gz | 129.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| llm_fingerprint-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 145.0 kB
Release files / llm_fingerprint-0.7.0.tar.gz
| Download URL | llm_fingerprint-0.7.0.tar.gz |
|---|---|
| Size | 129.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43b94c2d35a9a176361471a102a5f75f4704924ac700f7aee1021c2cb458c38e
|
|
BLAKE2b-256 checksum How to use checksums |
16b467645b4f8b0bd2a8d0a8fc5e6ea58421aab8f2c06641ea230f24443045c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / llm_fingerprint-0.7.0-py3-none-any.whl
| Download URL | llm_fingerprint-0.7.0-py3-none-any.whl |
|---|---|
| Size | 15.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
248f008ecf4e7f653c2e3c29bef770ba9718d32344af07a7cb4b9a7c4185ba1f
|
|
BLAKE2b-256 checksum How to use checksums |
4508790ac706ae34f5831daeea13f792fc4557ce87769000143525bdd2b7c88c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for llm_fingerprint 0.7.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.