# llm_content_filter
`llm_content_filter` es un paquete de Python flexible y fácil de usar que permite filtrar texto inapropiado para grandes modelos de lenguaje (LLMs). Con soporte para personalizar palabras prohibidas, manejar sinónimos y realizar filtrado contextual, es una herramienta poderosa para moderar contenido generado por LLMs.
## Instalación
Puedes instalar el paquete usando `pip`:
```bash
pip install llm_content_filter
```
## Uso
Aquí tienes un ejemplo de cómo utilizar `llm_content_filter` en un proyecto:
### 1. Filtrado básico con palabras predeterminadas
```python
from llm_content_filter.filter import LLMContentFilter
# Crear una instancia del filtro con las palabras predeterminadas
filter = LLMContentFilter()
# Verificar si un texto es apropiado
text = "This text promotes violence"
if not filter.is_appropriate(text):
print("Texto inapropiado detectado!")
# Filtrar el texto inapropiado
clean_text = filter.filter_text(text)
print(clean_text)
```
### 2. Usar palabras prohibidas personalizadas
```python
from llm_content_filter.filter import LLMContentFilter
# Crear una instancia del filtro con palabras prohibidas personalizadas
custom_banned_words = ["spam", "scam"]
filter = LLMContentFilter(banned_words=custom_banned_words)
# Filtrar un texto con las palabras personalizadas
text = "This text is a scam"
clean_text = filter.filter_text(text, replacement="[BLOCKED]")
print(clean_text)
```
### 3. Cargar y guardar listas de palabras prohibidas desde un archivo JSON
```python
from llm_content_filter.filter import LLMContentFilter
# Crear una instancia del filtro cargando las palabras prohibidas desde un archivo JSON
filter = LLMContentFilter(banned_words_file="custom_banned_words.json")
# Verificar si un texto es apropiado
text = "This text is offensive"
if not filter.is_appropriate(text):
print("Texto inapropiado detectado!")
# Guardar las palabras prohibidas actuales en un archivo JSON
filter.save_banned_words_to_file("updated_banned_words.json")
```
### 4. Filtrado avanzado con sinónimos y normalización de texto
```python
from llm_content_filter.filter import LLMContentFilter
# Supongamos que tienes un archivo JSON que incluye sinónimos y otras configuraciones avanzadas
filter = LLMContentFilter(banned_words_file="custom_banned_words_with_synonyms.json")
# Filtrar un texto con acentos y sinónimos
text = "This text contains brutalité, which is a form of violence"
clean_text = filter.filter_text(text)
print(clean_text) # Salida: "this text contains [REDACTED], which is a form of [REDACTED]"
```
## Características
- **Personalización Total:** Define tus propias listas de palabras prohibidas o carga listas desde archivos JSON.
- **Manejo de Sinónimos:** Detecta y filtra variaciones de palabras prohibidas usando sinónimos.
- **Filtrado Contextual:** Soporte para filtrado avanzado basado en el contexto (próximamente).
- **Normalización de Texto:** Elimina acentos y caracteres especiales para un filtrado más robusto.
## Contribución
Las contribuciones son bienvenidas. Por favor, abre un issue o un pull request en [GitHub](https://github.com/jclanas2019/llm_content_filter).
## Licencia
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.
## Contacto
Para cualquier consulta o sugerencia, puedes contactarme en `juancarlos.lanas.ocampo@gmail.com`.
## Ejemplo json
```json
{
"banned_words": [
"violence",
"hate",
"discrimination",
"abuse",
"offensive"
],
"synonyms": {
"violence": ["aggression", "brutality", "cruelty"],
"hate": ["detest", "loathe", "abhor"],
"discrimination": ["prejudice", "bias", "inequality"],
"abuse": ["mistreatment", "misuse", "exploitation"],
"offensive": ["insulting", "derogatory", "rude"]
},
"severity_levels": {
"violence": 5,
"hate": 4,
"discrimination": 4,
"abuse": 5,
"offensive": 3
},
"replacement_words": {
"default": "[REDACTED]",
"violence": "[VIOLENCE]",
"hate": "[HATE]",
"discrimination": "[DISCRIMINATION]",
"abuse": "[ABUSE]",
"offensive": "[OFFENSIVE]"
},
"contextual_filtering": {
"enabled": true,
"context_threshold": 0.8
}
}
```
# Uso con langchain y OpenAI
## Paso 1: Configuración de LangChain y OpenAI
### Primero, asegúrate de tener los paquetes necesarios instalados:
```bash
pip install langchain openai
```
## Paso 2: Implementación del Filtro Personalizado con LangChain
### Aquí te muestro cómo puedes adaptar tu filtro personalizado para que funcione dentro de un pipeline de LangChain:
```python
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from llm_content_filter.filter import LLMContentFilter
# Configurar OpenAI LLM
llm = OpenAI(temperature=0.7, openai_api_key="your-openai-api-key")
# Crear un template de prompt para LangChain
prompt_template = PromptTemplate(
input_variables=["input_text"],
template="Please generate a detailed response to the following input: {input_text}"
)
# Crear una cadena que usa el LLM con el prompt
chain = LLMChain(llm=llm, prompt=prompt_template)
# Crear una instancia del filtro cargando las palabras prohibidas desde un archivo JSON
filter = LLMContentFilter(banned_words_file="custom_banned_words.json")
# Ejemplo de texto para procesar
input_text = "This text is offensive"
# Generar texto usando LangChain y OpenAI
generated_text = chain.run(input_text)
# Verificar si el texto generado es apropiado
if not filter.is_appropriate(generated_text):
print("Texto inapropiado detectado!")
# Opcionalmente, puedes filtrar el texto antes de guardarlo o procesarlo
filtered_text = filter.filter_text(generated_text)
print("Texto filtrado:", filtered_text)
else:
print("Texto generado:", generated_text)
# Guardar las palabras prohibidas actuales en un archivo JSON
filter.save_banned_words_to_file("updated_banned_words.json")
```
Raw data
{
"_id": null,
"home_page": "https://github.com/jclanas2019/llm_content_filter",
"name": "llm-content-filter",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "LLM content filter NLP text moderation",
"author": "Juan Carlos Lanas Ocampo",
"author_email": "juancarlos.lanas.ocampo@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/ca/7f/199cb954398c839c9947baac0d1e8352f76d1579062fd6f7d5cfaef644bf/llm_content_filter-0.2.7.tar.gz",
"platform": null,
"description": "\r\n# llm_content_filter\r\n\r\n`llm_content_filter` es un paquete de Python flexible y f\u00e1cil de usar que permite filtrar texto inapropiado para grandes modelos de lenguaje (LLMs). Con soporte para personalizar palabras prohibidas, manejar sin\u00f3nimos y realizar filtrado contextual, es una herramienta poderosa para moderar contenido generado por LLMs.\r\n\r\n## Instalaci\u00f3n\r\n\r\nPuedes instalar el paquete usando `pip`:\r\n\r\n```bash\r\npip install llm_content_filter\r\n```\r\n\r\n## Uso\r\n\r\nAqu\u00ed tienes un ejemplo de c\u00f3mo utilizar `llm_content_filter` en un proyecto:\r\n\r\n### 1. Filtrado b\u00e1sico con palabras predeterminadas\r\n\r\n```python\r\nfrom llm_content_filter.filter import LLMContentFilter\r\n\r\n# Crear una instancia del filtro con las palabras predeterminadas\r\nfilter = LLMContentFilter()\r\n\r\n# Verificar si un texto es apropiado\r\ntext = \"This text promotes violence\"\r\nif not filter.is_appropriate(text):\r\n print(\"Texto inapropiado detectado!\")\r\n\r\n# Filtrar el texto inapropiado\r\nclean_text = filter.filter_text(text)\r\nprint(clean_text)\r\n```\r\n\r\n### 2. Usar palabras prohibidas personalizadas\r\n\r\n```python\r\nfrom llm_content_filter.filter import LLMContentFilter\r\n\r\n# Crear una instancia del filtro con palabras prohibidas personalizadas\r\ncustom_banned_words = [\"spam\", \"scam\"]\r\nfilter = LLMContentFilter(banned_words=custom_banned_words)\r\n\r\n# Filtrar un texto con las palabras personalizadas\r\ntext = \"This text is a scam\"\r\nclean_text = filter.filter_text(text, replacement=\"[BLOCKED]\")\r\nprint(clean_text)\r\n```\r\n\r\n### 3. Cargar y guardar listas de palabras prohibidas desde un archivo JSON\r\n\r\n```python\r\nfrom llm_content_filter.filter import LLMContentFilter\r\n\r\n# Crear una instancia del filtro cargando las palabras prohibidas desde un archivo JSON\r\nfilter = LLMContentFilter(banned_words_file=\"custom_banned_words.json\")\r\n\r\n# Verificar si un texto es apropiado\r\ntext = \"This text is offensive\"\r\nif not filter.is_appropriate(text):\r\n print(\"Texto inapropiado detectado!\")\r\n\r\n# Guardar las palabras prohibidas actuales en un archivo JSON\r\nfilter.save_banned_words_to_file(\"updated_banned_words.json\")\r\n```\r\n\r\n### 4. Filtrado avanzado con sin\u00f3nimos y normalizaci\u00f3n de texto\r\n\r\n```python\r\nfrom llm_content_filter.filter import LLMContentFilter\r\n\r\n# Supongamos que tienes un archivo JSON que incluye sin\u00f3nimos y otras configuraciones avanzadas\r\nfilter = LLMContentFilter(banned_words_file=\"custom_banned_words_with_synonyms.json\")\r\n\r\n# Filtrar un texto con acentos y sin\u00f3nimos\r\ntext = \"This text contains brutalit\u00e9, which is a form of violence\"\r\nclean_text = filter.filter_text(text)\r\nprint(clean_text) # Salida: \"this text contains [REDACTED], which is a form of [REDACTED]\"\r\n```\r\n\r\n## Caracter\u00edsticas\r\n\r\n- **Personalizaci\u00f3n Total:** Define tus propias listas de palabras prohibidas o carga listas desde archivos JSON.\r\n- **Manejo de Sin\u00f3nimos:** Detecta y filtra variaciones de palabras prohibidas usando sin\u00f3nimos.\r\n- **Filtrado Contextual:** Soporte para filtrado avanzado basado en el contexto (pr\u00f3ximamente).\r\n- **Normalizaci\u00f3n de Texto:** Elimina acentos y caracteres especiales para un filtrado m\u00e1s robusto.\r\n\r\n## Contribuci\u00f3n\r\n\r\nLas contribuciones son bienvenidas. Por favor, abre un issue o un pull request en [GitHub](https://github.com/jclanas2019/llm_content_filter).\r\n\r\n## Licencia\r\n\r\nEste proyecto est\u00e1 licenciado bajo la Licencia MIT. Consulta el archivo [LICENSE](LICENSE) para m\u00e1s detalles.\r\n\r\n## Contacto\r\n\r\nPara cualquier consulta o sugerencia, puedes contactarme en `juancarlos.lanas.ocampo@gmail.com`.\r\n\r\n## Ejemplo json \r\n```json\r\n{\r\n \"banned_words\": [\r\n \"violence\",\r\n \"hate\",\r\n \"discrimination\",\r\n \"abuse\",\r\n \"offensive\"\r\n ],\r\n \"synonyms\": {\r\n \"violence\": [\"aggression\", \"brutality\", \"cruelty\"],\r\n \"hate\": [\"detest\", \"loathe\", \"abhor\"],\r\n \"discrimination\": [\"prejudice\", \"bias\", \"inequality\"],\r\n \"abuse\": [\"mistreatment\", \"misuse\", \"exploitation\"],\r\n \"offensive\": [\"insulting\", \"derogatory\", \"rude\"]\r\n },\r\n \"severity_levels\": {\r\n \"violence\": 5,\r\n \"hate\": 4,\r\n \"discrimination\": 4,\r\n \"abuse\": 5,\r\n \"offensive\": 3\r\n },\r\n \"replacement_words\": {\r\n \"default\": \"[REDACTED]\",\r\n \"violence\": \"[VIOLENCE]\",\r\n \"hate\": \"[HATE]\",\r\n \"discrimination\": \"[DISCRIMINATION]\",\r\n \"abuse\": \"[ABUSE]\",\r\n \"offensive\": \"[OFFENSIVE]\"\r\n },\r\n \"contextual_filtering\": {\r\n \"enabled\": true,\r\n \"context_threshold\": 0.8\r\n }\r\n}\r\n```\r\n# Uso con langchain y OpenAI\r\n## Paso 1: Configuraci\u00f3n de LangChain y OpenAI\r\n### Primero, aseg\u00farate de tener los paquetes necesarios instalados:\r\n\r\n```bash\r\npip install langchain openai\r\n```\r\n\r\n## Paso 2: Implementaci\u00f3n del Filtro Personalizado con LangChain\r\n### Aqu\u00ed te muestro c\u00f3mo puedes adaptar tu filtro personalizado para que funcione dentro de un pipeline de LangChain:\r\n\r\n```python\r\nfrom langchain.llms import OpenAI\r\nfrom langchain.chains import LLMChain\r\nfrom langchain.prompts import PromptTemplate\r\nfrom llm_content_filter.filter import LLMContentFilter\r\n\r\n# Configurar OpenAI LLM\r\nllm = OpenAI(temperature=0.7, openai_api_key=\"your-openai-api-key\")\r\n\r\n# Crear un template de prompt para LangChain\r\nprompt_template = PromptTemplate(\r\n input_variables=[\"input_text\"],\r\n template=\"Please generate a detailed response to the following input: {input_text}\"\r\n)\r\n\r\n# Crear una cadena que usa el LLM con el prompt\r\nchain = LLMChain(llm=llm, prompt=prompt_template)\r\n\r\n# Crear una instancia del filtro cargando las palabras prohibidas desde un archivo JSON\r\nfilter = LLMContentFilter(banned_words_file=\"custom_banned_words.json\")\r\n\r\n# Ejemplo de texto para procesar\r\ninput_text = \"This text is offensive\"\r\n\r\n# Generar texto usando LangChain y OpenAI\r\ngenerated_text = chain.run(input_text)\r\n\r\n# Verificar si el texto generado es apropiado\r\nif not filter.is_appropriate(generated_text):\r\n print(\"Texto inapropiado detectado!\")\r\n # Opcionalmente, puedes filtrar el texto antes de guardarlo o procesarlo\r\n filtered_text = filter.filter_text(generated_text)\r\n print(\"Texto filtrado:\", filtered_text)\r\nelse:\r\n print(\"Texto generado:\", generated_text)\r\n\r\n# Guardar las palabras prohibidas actuales en un archivo JSON\r\nfilter.save_banned_words_to_file(\"updated_banned_words.json\")\r\n```\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A simple and customizable content filter for LLMs",
"version": "0.2.7",
"project_urls": {
"Bug Reports": "https://github.com/jclanas2019/llm_content_filter/issues",
"Homepage": "https://github.com/jclanas2019/llm_content_filter",
"Source": "https://github.com/jclanas2019/llm_content_filter/"
},
"split_keywords": [
"llm",
"content",
"filter",
"nlp",
"text",
"moderation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "397c9484df2ea3ea86a7affd5d5b665b7178b73a6e439e61b1ed38472b1e1481",
"md5": "345c682edbad0c03eeec183b3dc2bff5",
"sha256": "2a8e19b664b505fe122f5a8a0cafe28c829d2a90a1642aaa2ef5bf0c917641b1"
},
"downloads": -1,
"filename": "llm_content_filter-0.2.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "345c682edbad0c03eeec183b3dc2bff5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 6440,
"upload_time": "2024-08-25T15:05:22",
"upload_time_iso_8601": "2024-08-25T15:05:22.231551Z",
"url": "https://files.pythonhosted.org/packages/39/7c/9484df2ea3ea86a7affd5d5b665b7178b73a6e439e61b1ed38472b1e1481/llm_content_filter-0.2.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ca7f199cb954398c839c9947baac0d1e8352f76d1579062fd6f7d5cfaef644bf",
"md5": "92c82792045d8ca15b8656df61659c1e",
"sha256": "60fc259096a6656aacdf0070dc067bd6be5e9766a2bfce27c1a54dc9ca0d7083"
},
"downloads": -1,
"filename": "llm_content_filter-0.2.7.tar.gz",
"has_sig": false,
"md5_digest": "92c82792045d8ca15b8656df61659c1e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 6157,
"upload_time": "2024-08-25T15:05:24",
"upload_time_iso_8601": "2024-08-25T15:05:24.719898Z",
"url": "https://files.pythonhosted.org/packages/ca/7f/199cb954398c839c9947baac0d1e8352f76d1579062fd6f7d5cfaef644bf/llm_content_filter-0.2.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-25 15:05:24",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jclanas2019",
"github_project": "llm_content_filter",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "llm-content-filter"
}