mirror of
https://github.com/arc53/DocsGPT.git
synced 2025-11-29 16:43:16 +00:00
* feat: template-based prompt rendering with dynamic namespace injection * refactor: improve template engine initialization with clearer formatting * refactor: streamline ReActAgent methods and improve content extraction logic feat: enhance error handling in NamespaceManager and TemplateEngine fix: update NewAgent component to ensure consistent form data submission test: modify tests for ReActAgent and prompt renderer to reflect method changes and improve coverage * feat: tools namespace + three-tier token budget * refactor: remove unused variable assignment in message building tests * Enhance prompt customization and tool pre-fetching functionality * ruff lint fix * refactor: cleaner error handling and reduce code clutter --------- Co-authored-by: Alex <a@tushynski.me>
454 lines
10 KiB
Plaintext
454 lines
10 KiB
Plaintext
---
|
|
title: Customizing Prompts
|
|
description: This guide explains how to customize prompts in DocsGPT using the new template-based system with dynamic variable injection.
|
|
---
|
|
|
|
import Image from 'next/image'
|
|
|
|
# Customizing Prompts in DocsGPT
|
|
|
|
Customizing prompts for DocsGPT gives you powerful control over the AI's behavior and responses. With the new template-based system, you can inject dynamic context through organized namespaces, making prompts flexible and maintainable without hardcoding values.
|
|
|
|
## Quick Start
|
|
|
|
1. Navigate to `SideBar -> Settings`.
|
|
2. In Settings, select the `Active Prompt` to see various prompt styles.
|
|
3. Click on the `edit icon` on your chosen prompt to customize it.
|
|
|
|
### Video Demo
|
|
<Image src="/prompts.gif" alt="prompts" width={800} height={500} />
|
|
|
|
---
|
|
|
|
## Template-Based Prompt System
|
|
|
|
DocsGPT now uses **Jinja2 templating** with four organized namespaces for dynamic variable injection:
|
|
|
|
### Available Namespaces
|
|
|
|
#### 1. **`system`** - System Metadata
|
|
Access system-level information:
|
|
|
|
```jinja
|
|
{{ system.date }} # Current date (YYYY-MM-DD)
|
|
{{ system.time }} # Current time (HH:MM:SS)
|
|
{{ system.timestamp }} # ISO 8601 timestamp
|
|
{{ system.request_id }} # Unique request identifier
|
|
{{ system.user_id }} # Current user ID
|
|
```
|
|
|
|
#### 2. **`source`** - Retrieved Documents
|
|
Access RAG (Retrieval-Augmented Generation) document context:
|
|
|
|
```jinja
|
|
{{ source.content }} # Concatenated document content
|
|
{{ source.summaries }} # Alias for content (backward compatible)
|
|
{{ source.documents }} # List of document objects
|
|
{{ source.count }} # Number of retrieved documents
|
|
```
|
|
|
|
#### 3. **`passthrough`** - Request Parameters
|
|
Access custom parameters passed in the API request:
|
|
|
|
```jinja
|
|
{{ passthrough.company }} # Custom field from request
|
|
{{ passthrough.user_name }} # User-provided data
|
|
{{ passthrough.context }} # Any custom parameter
|
|
```
|
|
|
|
To use passthrough data, send it in your API request:
|
|
```json
|
|
{
|
|
"question": "What is the pricing?",
|
|
"passthrough": {
|
|
"company": "Acme Corp",
|
|
"user_name": "Alice",
|
|
"plan_type": "enterprise"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 4. **`tools`** - Pre-fetched Tool Data
|
|
Access results from tools that run before the agent (like memory tool):
|
|
|
|
```jinja
|
|
{{ tools.memory.root }} # Memory tool directory listing
|
|
{{ tools.memory.available }} # Boolean: is memory available
|
|
```
|
|
|
|
---
|
|
|
|
## Example Prompts
|
|
|
|
### Basic Prompt with Documents
|
|
```jinja
|
|
You are a helpful AI assistant for DocsGPT.
|
|
|
|
Current date: {{ system.date }}
|
|
|
|
Use the following documents to answer the question:
|
|
|
|
{{ source.content }}
|
|
|
|
Provide accurate, helpful answers with code examples when relevant.
|
|
```
|
|
|
|
### Advanced Prompt with All Namespaces
|
|
```jinja
|
|
You are an AI assistant for {{ passthrough.company }}.
|
|
|
|
**System Info:**
|
|
- Date: {{ system.date }}
|
|
- Request ID: {{ system.request_id }}
|
|
|
|
**User Context:**
|
|
- User: {{ passthrough.user_name }}
|
|
- Role: {{ passthrough.role }}
|
|
|
|
**Available Documents ({{ source.count }}):**
|
|
{{ source.content }}
|
|
|
|
**Memory Context:**
|
|
{% if tools.memory.available %}
|
|
{{ tools.memory.root }}
|
|
{% else %}
|
|
No saved context available.
|
|
{% endif %}
|
|
|
|
Please provide detailed, accurate answers based on the documents above.
|
|
```
|
|
|
|
### Conditional Logic Example
|
|
```jinja
|
|
You are a DocsGPT assistant.
|
|
|
|
{% if source.count > 0 %}
|
|
I found {{ source.count }} relevant document(s):
|
|
|
|
{{ source.content }}
|
|
|
|
Base your answer on these documents.
|
|
{% else %}
|
|
No documents were found. Please answer based on your general knowledge.
|
|
{% endif %}
|
|
```
|
|
|
|
---
|
|
|
|
## Migration Guide
|
|
|
|
### Legacy Format (Still Supported)
|
|
The old `{summaries}` format continues to work for backward compatibility:
|
|
|
|
```markdown
|
|
You are a helpful assistant.
|
|
|
|
Documents:
|
|
{summaries}
|
|
```
|
|
|
|
This will automatically substitute `{summaries}` with document content.
|
|
|
|
### New Template Format (Recommended)
|
|
Migrate to the new template syntax for more flexibility:
|
|
|
|
```jinja
|
|
You are a helpful assistant.
|
|
|
|
Documents:
|
|
{{ source.content }}
|
|
```
|
|
|
|
**Migration mapping:**
|
|
- `{summaries}` → `{{ source.content }}` or `{{ source.summaries }}`
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### 1. **Use Descriptive Context**
|
|
```jinja
|
|
**Retrieved Documents:**
|
|
{{ source.content }}
|
|
|
|
**User Query Context:**
|
|
- Company: {{ passthrough.company }}
|
|
- Department: {{ passthrough.department }}
|
|
```
|
|
|
|
### 2. **Handle Missing Data Gracefully**
|
|
```jinja
|
|
{% if passthrough.user_name %}
|
|
Hello {{ passthrough.user_name }}!
|
|
{% endif %}
|
|
```
|
|
|
|
### 3. **Leverage Memory for Continuity**
|
|
```jinja
|
|
{% if tools.memory.available %}
|
|
**Previous Context:**
|
|
{{ tools.memory.root }}
|
|
{% endif %}
|
|
|
|
**Current Question:**
|
|
Please consider the above context when answering.
|
|
```
|
|
|
|
### 4. **Add Clear Instructions**
|
|
```jinja
|
|
You are a technical support assistant.
|
|
|
|
**Guidelines:**
|
|
1. Always reference the documents below
|
|
2. Provide step-by-step instructions
|
|
3. Include code examples when relevant
|
|
|
|
**Reference Documents:**
|
|
{{ source.content }}
|
|
```
|
|
|
|
---
|
|
|
|
## Advanced Features
|
|
|
|
### Looping Over Documents
|
|
```jinja
|
|
{% for doc in source.documents %}
|
|
**Source {{ loop.index }}:** {{ doc.filename }}
|
|
{{ doc.text }}
|
|
|
|
{% endfor %}
|
|
```
|
|
|
|
### Date-Based Behavior
|
|
```jinja
|
|
{% if system.date > "2025-01-01" %}
|
|
Note: This is information from 2025 or later.
|
|
{% endif %}
|
|
```
|
|
|
|
### Custom Formatting
|
|
```jinja
|
|
**Request Information**
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
• Request ID: {{ system.request_id }}
|
|
• User: {{ passthrough.user_name | default("Guest") }}
|
|
• Time: {{ system.time }}
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
```
|
|
|
|
---
|
|
|
|
## Tool Pre-Fetching
|
|
|
|
### Memory Tool Configuration
|
|
Enable memory tool pre-fetching to inject saved context into prompts:
|
|
|
|
```python
|
|
# In your tool configuration
|
|
{
|
|
"name": "memory",
|
|
"config": {
|
|
"pre_fetch_enabled": true # Default: true
|
|
}
|
|
}
|
|
```
|
|
|
|
Control pre-fetching globally:
|
|
```bash
|
|
# .env file
|
|
ENABLE_TOOL_PREFETCH=true
|
|
```
|
|
|
|
Or per-request:
|
|
```json
|
|
{
|
|
"question": "What are the requirements?",
|
|
"disable_tool_prefetch": false
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Debugging Prompts
|
|
|
|
### View Rendered Prompts in Logs
|
|
Set log level to `INFO` to see the final rendered prompt sent to the LLM:
|
|
|
|
```bash
|
|
export LOG_LEVEL=INFO
|
|
```
|
|
|
|
You'll see output like:
|
|
```
|
|
INFO - Rendered system prompt for agent (length: 1234 chars):
|
|
================================================================================
|
|
You are a helpful assistant for Acme Corp.
|
|
|
|
Current date: 2025-10-30
|
|
Request ID: req_abc123
|
|
|
|
Documents:
|
|
Technical documentation about...
|
|
================================================================================
|
|
```
|
|
|
|
### Template Validation
|
|
Test your template syntax before saving:
|
|
```python
|
|
from application.api.answer.services.prompt_renderer import PromptRenderer
|
|
|
|
renderer = PromptRenderer()
|
|
is_valid = renderer.validate_template("Your prompt with {{ variables }}")
|
|
```
|
|
|
|
---
|
|
|
|
## Common Use Cases
|
|
|
|
### 1. Customer Support Bot
|
|
```jinja
|
|
You are a customer support assistant for {{ passthrough.company }}.
|
|
|
|
**Customer:** {{ passthrough.customer_name }}
|
|
**Ticket ID:** {{ system.request_id }}
|
|
**Date:** {{ system.date }}
|
|
|
|
**Knowledge Base:**
|
|
{{ source.content }}
|
|
|
|
**Previous Interactions:**
|
|
{{ tools.memory.root }}
|
|
|
|
Please provide helpful, friendly support based on the knowledge base above.
|
|
```
|
|
|
|
### 2. Technical Documentation Assistant
|
|
```jinja
|
|
You are a technical documentation expert.
|
|
|
|
**Available Documentation ({{ source.count }} documents):**
|
|
{{ source.content }}
|
|
|
|
**Requirements:**
|
|
- Provide code examples in {{ passthrough.language }}
|
|
- Focus on {{ passthrough.framework }} best practices
|
|
- Include relevant links when possible
|
|
```
|
|
|
|
### 3. Internal Knowledge Base
|
|
```jinja
|
|
You are an internal AI assistant for {{ passthrough.department }}.
|
|
|
|
**Employee:** {{ passthrough.employee_name }}
|
|
**Access Level:** {{ passthrough.access_level }}
|
|
|
|
**Relevant Documents:**
|
|
{{ source.content }}
|
|
|
|
Provide detailed answers appropriate for {{ passthrough.access_level }} access level.
|
|
```
|
|
|
|
---
|
|
|
|
## Template Syntax Reference
|
|
|
|
### Variables
|
|
```jinja
|
|
{{ variable_name }} # Output variable
|
|
{{ namespace.field }} # Access nested field
|
|
{{ variable | default("N/A") }} # Default value
|
|
```
|
|
|
|
### Conditionals
|
|
```jinja
|
|
{% if condition %}
|
|
Content
|
|
{% elif other_condition %}
|
|
Other content
|
|
{% else %}
|
|
Default content
|
|
{% endif %}
|
|
```
|
|
|
|
### Loops
|
|
```jinja
|
|
{% for item in list %}
|
|
{{ item.field }}
|
|
{% endfor %}
|
|
```
|
|
|
|
### Comments
|
|
```jinja
|
|
{# This is a comment and won't appear in output #}
|
|
```
|
|
|
|
---
|
|
|
|
## Security Considerations
|
|
|
|
1. **Input Sanitization**: Passthrough data is automatically sanitized to prevent injection attacks
|
|
2. **Type Filtering**: Only primitive types (string, int, float, bool, None) are allowed in passthrough
|
|
3. **Autoescaping**: Jinja2 autoescaping is enabled by default
|
|
4. **Size Limits**: Consider the token budget when including large documents
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Problem: Variables Not Rendering
|
|
**Solution:** Ensure you're using the correct namespace:
|
|
```jinja
|
|
❌ {{ company }}
|
|
✅ {{ passthrough.company }}
|
|
```
|
|
|
|
### Problem: Empty Output for Tool Data
|
|
**Solution:** Check that tool pre-fetching is enabled and the tool is configured correctly.
|
|
|
|
### Problem: Syntax Errors
|
|
**Solution:** Validate template syntax. Common issues:
|
|
```jinja
|
|
❌ {{ variable } # Missing closing brace
|
|
❌ {% if x % # Missing closing %}
|
|
✅ {{ variable }}
|
|
✅ {% if x %}...{% endif %}
|
|
```
|
|
|
|
### Problem: Legacy Prompts Not Working
|
|
**Solution:** The system auto-detects template syntax. If your prompt uses `{summaries}`, it will work in legacy mode. To use new features, add `{{ }}` syntax.
|
|
|
|
---
|
|
|
|
## API Reference
|
|
|
|
### Render Prompt via API
|
|
```python
|
|
from application.api.answer.services.prompt_renderer import PromptRenderer
|
|
|
|
renderer = PromptRenderer()
|
|
rendered = renderer.render_prompt(
|
|
prompt_content="Your template with {{ passthrough.name }}",
|
|
user_id="user_123",
|
|
request_id="req_456",
|
|
passthrough_data={"name": "Alice"},
|
|
docs_together="Document content here",
|
|
tools_data={"memory": {"root": "Files: notes.txt"}}
|
|
)
|
|
```
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
The new template-based prompt system provides powerful flexibility while maintaining backward compatibility. By leveraging namespaces, you can create dynamic, context-aware prompts that adapt to your specific use case.
|
|
|
|
**Key Benefits:**
|
|
- ✅ Dynamic variable injection
|
|
- ✅ Organized namespaces
|
|
- ✅ Backward compatible
|
|
- ✅ Security built-in
|
|
- ✅ Easy to debug
|
|
|
|
Start with simple templates and gradually add complexity as needed. Happy prompting! 🚀
|