551 lines
14 KiB
Markdown
551 lines
14 KiB
Markdown
# AI Context & Prompting Templates - Maternal Organization App
|
|
|
|
## LangChain Configuration
|
|
|
|
### Core Setup
|
|
```typescript
|
|
// services/ai/langchainConfig.ts
|
|
import { ChatOpenAI } from 'langchain/chat_models/openai';
|
|
import { ConversationSummaryMemory } from 'langchain/memory';
|
|
import { PromptTemplate } from 'langchain/prompts';
|
|
import { LLMChain } from 'langchain/chains';
|
|
|
|
export const initializeLangChain = () => {
|
|
const model = new ChatOpenAI({
|
|
modelName: 'gpt-4-turbo-preview',
|
|
temperature: 0.7,
|
|
maxTokens: 1000,
|
|
openAIApiKey: process.env.OPENAI_API_KEY,
|
|
callbacks: [
|
|
{
|
|
handleLLMStart: async (llm, prompts) => {
|
|
logger.info('LLM request started', { promptLength: prompts[0].length });
|
|
},
|
|
handleLLMEnd: async (output) => {
|
|
logger.info('LLM request completed', { tokensUsed: output.llmOutput?.tokenUsage });
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
const memory = new ConversationSummaryMemory({
|
|
memoryKey: 'chat_history',
|
|
llm: model,
|
|
maxTokenLimit: 2000,
|
|
});
|
|
|
|
return { model, memory };
|
|
};
|
|
```
|
|
|
|
### Context Window Management
|
|
```typescript
|
|
class ContextManager {
|
|
private maxContextTokens = 4000;
|
|
private priorityWeights = {
|
|
currentQuery: 1.0,
|
|
recentActivities: 0.8,
|
|
childProfile: 0.7,
|
|
historicalPatterns: 0.6,
|
|
generalGuidelines: 0.4,
|
|
};
|
|
|
|
async buildContext(
|
|
query: string,
|
|
childId: string,
|
|
userId: string
|
|
): Promise<AIContext> {
|
|
const contexts = await Promise.all([
|
|
this.getChildProfile(childId),
|
|
this.getRecentActivities(childId, 48), // Last 48 hours
|
|
this.getPatterns(childId),
|
|
this.getParentPreferences(userId),
|
|
this.getPreviousConversation(userId, childId),
|
|
]);
|
|
|
|
return this.prioritizeContext(contexts, query);
|
|
}
|
|
|
|
private prioritizeContext(
|
|
contexts: ContextPart[],
|
|
query: string
|
|
): AIContext {
|
|
// Token counting
|
|
let currentTokens = this.countTokens(query);
|
|
const prioritizedContexts: ContextPart[] = [];
|
|
|
|
// Sort by relevance and priority
|
|
const sorted = contexts
|
|
.map(ctx => ({
|
|
...ctx,
|
|
score: this.calculateRelevance(ctx, query) * this.priorityWeights[ctx.type],
|
|
}))
|
|
.sort((a, b) => b.score - a.score);
|
|
|
|
// Add contexts until token limit
|
|
for (const context of sorted) {
|
|
const tokens = this.countTokens(context.content);
|
|
if (currentTokens + tokens <= this.maxContextTokens) {
|
|
prioritizedContexts.push(context);
|
|
currentTokens += tokens;
|
|
}
|
|
}
|
|
|
|
return {
|
|
query,
|
|
contexts: prioritizedContexts,
|
|
totalTokens: currentTokens,
|
|
};
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## System Prompts
|
|
|
|
### Base System Prompt
|
|
```typescript
|
|
const BASE_SYSTEM_PROMPT = `You are a knowledgeable, empathetic AI assistant helping parents care for their children aged 0-6 years.
|
|
|
|
Core Guidelines:
|
|
1. SAFETY FIRST: Never provide medical diagnoses. Always recommend consulting healthcare providers for medical concerns.
|
|
2. EVIDENCE-BASED: Provide advice based on pediatric best practices and research.
|
|
3. PARENT-SUPPORTIVE: Be encouraging and non-judgmental. Every family is different.
|
|
4. PRACTICAL: Give actionable, realistic suggestions that work for busy parents.
|
|
5. CULTURALLY AWARE: Respect diverse parenting approaches and cultural practices.
|
|
|
|
You have access to:
|
|
- The child's recent activity data (feeding, sleep, diapers)
|
|
- Developmental milestones for their age
|
|
- Pattern analysis from their historical data
|
|
- Family preferences and routines
|
|
|
|
Response Guidelines:
|
|
- Keep responses concise (under 150 words unless asked for detail)
|
|
- Use simple, clear language (avoid medical jargon)
|
|
- Provide specific, actionable suggestions
|
|
- Acknowledge parent concerns with empathy
|
|
- Include relevant safety warnings when appropriate`;
|
|
```
|
|
|
|
### Child-Specific Context Template
|
|
```typescript
|
|
const CHILD_CONTEXT_TEMPLATE = `Child Profile:
|
|
- Name: {childName}
|
|
- Age: {ageInMonths} months ({ageInYears} years)
|
|
- Developmental Stage: {developmentalStage}
|
|
- Known Conditions: {medicalConditions}
|
|
- Allergies: {allergies}
|
|
|
|
Recent Patterns (last 7 days):
|
|
- Average sleep: {avgSleepHours} hours/day
|
|
- Feeding frequency: Every {feedingInterval} hours
|
|
- Growth trajectory: {growthPercentile} percentile
|
|
|
|
Current Concerns:
|
|
{parentConcerns}
|
|
|
|
Recent Activities (last 24 hours):
|
|
{recentActivities}`;
|
|
```
|
|
|
|
---
|
|
|
|
## Prompt Templates by Scenario
|
|
|
|
### Sleep-Related Queries
|
|
```typescript
|
|
const SLEEP_PROMPT = PromptTemplate.fromTemplate(`
|
|
${BASE_SYSTEM_PROMPT}
|
|
|
|
Context:
|
|
{childContext}
|
|
|
|
Sleep-Specific Data:
|
|
- Recent bedtimes: {recentBedtimes}
|
|
- Wake windows today: {wakeWindows}
|
|
- Nap schedule: {napSchedule}
|
|
- Sleep regression risk: {regressionRisk}
|
|
|
|
Parent Question: {question}
|
|
|
|
Provide practical sleep advice considering:
|
|
1. Age-appropriate wake windows
|
|
2. Recent sleep patterns
|
|
3. Common sleep regressions at this age
|
|
4. Environmental factors
|
|
|
|
Response:
|
|
`);
|
|
```
|
|
|
|
### Feeding Queries
|
|
```typescript
|
|
const FEEDING_PROMPT = PromptTemplate.fromTemplate(`
|
|
${BASE_SYSTEM_PROMPT}
|
|
|
|
Context:
|
|
{childContext}
|
|
|
|
Feeding-Specific Data:
|
|
- Feeding type: {feedingType}
|
|
- Recent intake: {recentIntake}
|
|
- Growth trend: {growthTrend}
|
|
- Solid foods status: {solidsStatus}
|
|
|
|
Parent Question: {question}
|
|
|
|
Provide feeding guidance considering:
|
|
1. Age-appropriate feeding amounts
|
|
2. Growth patterns
|
|
3. Feeding milestones
|
|
4. Any mentioned concerns
|
|
|
|
Response:
|
|
`);
|
|
```
|
|
|
|
### Developmental Milestones
|
|
```typescript
|
|
const MILESTONE_PROMPT = PromptTemplate.fromTemplate(`
|
|
${BASE_SYSTEM_PROMPT}
|
|
|
|
Context:
|
|
{childContext}
|
|
|
|
Developmental Data:
|
|
- Expected milestones: {expectedMilestones}
|
|
- Achieved milestones: {achievedMilestones}
|
|
- Areas of focus: {developmentalFocus}
|
|
|
|
Parent Question: {question}
|
|
|
|
Provide developmental guidance:
|
|
1. What's typical for this age
|
|
2. Activities to encourage development
|
|
3. When to consult professionals
|
|
4. Celebrate achievements while avoiding comparison
|
|
|
|
Response:
|
|
`);
|
|
```
|
|
|
|
### Behavioral Concerns
|
|
```typescript
|
|
const BEHAVIOR_PROMPT = PromptTemplate.fromTemplate(`
|
|
${BASE_SYSTEM_PROMPT}
|
|
|
|
Context:
|
|
{childContext}
|
|
|
|
Behavioral Patterns:
|
|
- Recent behaviors: {recentBehaviors}
|
|
- Triggers identified: {triggers}
|
|
- Sleep/hunger status: {physiologicalState}
|
|
|
|
Parent Question: {question}
|
|
|
|
Provide behavioral guidance:
|
|
1. Age-appropriate expectations
|
|
2. Positive parenting strategies
|
|
3. Understanding underlying needs
|
|
4. Consistency and routine importance
|
|
|
|
Response:
|
|
`);
|
|
```
|
|
|
|
---
|
|
|
|
## Safety Boundaries
|
|
|
|
### Medical Disclaimer Triggers
|
|
```typescript
|
|
const MEDICAL_TRIGGERS = [
|
|
'diagnose', 'disease', 'syndrome', 'disorder',
|
|
'medication', 'dosage', 'prescription',
|
|
'emergency', 'urgent', 'bleeding', 'unconscious',
|
|
'seizure', 'fever over 104', 'difficulty breathing',
|
|
];
|
|
|
|
const MEDICAL_DISCLAIMER = `I understand you're concerned about {concern}. This seems like a medical issue that requires professional evaluation. Please contact your pediatrician or healthcare provider immediately. If this is an emergency, call your local emergency number.
|
|
|
|
For reference, here are signs requiring immediate medical attention:
|
|
- Difficulty breathing or bluish skin
|
|
- Unresponsiveness or difficulty waking
|
|
- High fever (over 104°F/40°C)
|
|
- Severe dehydration
|
|
- Head injury with vomiting or confusion`;
|
|
```
|
|
|
|
### Mental Health Support
|
|
```typescript
|
|
const MENTAL_HEALTH_PROMPT = `I hear that you're going through a difficult time. Your feelings are valid and important.
|
|
|
|
Here are some immediate resources:
|
|
- Postpartum Support International: 1-800-4-PPD-MOMS
|
|
- Crisis Text Line: Text HOME to 741741
|
|
- Local support groups: {localResources}
|
|
|
|
Please consider reaching out to:
|
|
- Your healthcare provider
|
|
- A mental health professional
|
|
- Trusted family or friends
|
|
|
|
Remember: Seeking help is a sign of strength, not weakness. Your wellbeing matters for both you and your baby.`;
|
|
```
|
|
|
|
---
|
|
|
|
## Response Formatting
|
|
|
|
### Structured Response Template
|
|
```typescript
|
|
interface AIResponse {
|
|
mainAnswer: string;
|
|
keyPoints?: string[];
|
|
actionItems?: string[];
|
|
safetyNotes?: string[];
|
|
relatedResources?: Resource[];
|
|
confidenceLevel: 'high' | 'medium' | 'low';
|
|
shouldEscalate: boolean;
|
|
}
|
|
|
|
const formatResponse = (raw: string, metadata: ResponseMetadata): AIResponse => {
|
|
return {
|
|
mainAnswer: extractMainAnswer(raw),
|
|
keyPoints: extractBulletPoints(raw),
|
|
actionItems: extractActionItems(raw),
|
|
safetyNotes: extractSafetyWarnings(raw),
|
|
relatedResources: findRelevantResources(metadata),
|
|
confidenceLevel: calculateConfidence(metadata),
|
|
shouldEscalate: checkEscalationTriggers(raw),
|
|
};
|
|
};
|
|
```
|
|
|
|
### Localized Response Generation
|
|
```typescript
|
|
const LOCALIZED_PROMPTS = {
|
|
'en-US': {
|
|
greeting: "I understand your concern about {topic}.",
|
|
transition: "Based on {childName}'s patterns,",
|
|
closing: "Remember, every baby is different.",
|
|
},
|
|
'es-ES': {
|
|
greeting: "Entiendo tu preocupación sobre {topic}.",
|
|
transition: "Basándome en los patrones de {childName},",
|
|
closing: "Recuerda, cada bebé es diferente.",
|
|
},
|
|
'fr-FR': {
|
|
greeting: "Je comprends votre inquiétude concernant {topic}.",
|
|
transition: "D'après les habitudes de {childName},",
|
|
closing: "Rappelez-vous, chaque bébé est unique.",
|
|
},
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## Personalization Engine
|
|
|
|
### Learning from Feedback
|
|
```typescript
|
|
class PersonalizationEngine {
|
|
async updateResponsePreferences(
|
|
userId: string,
|
|
feedback: UserFeedback
|
|
) {
|
|
const preferences = await this.getUserPreferences(userId);
|
|
|
|
// Update preference weights
|
|
if (feedback.helpful) {
|
|
preferences.preferredResponseLength = feedback.responseLength;
|
|
preferences.preferredDetailLevel = feedback.detailLevel;
|
|
preferences.preferredTone = feedback.tone;
|
|
}
|
|
|
|
// Learn from negative feedback
|
|
if (!feedback.helpful && feedback.reason) {
|
|
this.adjustPromptTemplate(preferences, feedback.reason);
|
|
}
|
|
|
|
await this.saveUserPreferences(userId, preferences);
|
|
}
|
|
|
|
private adjustPromptTemplate(
|
|
preferences: UserPreferences,
|
|
reason: string
|
|
): PromptTemplate {
|
|
const adjustments = {
|
|
'too_technical': { jargonLevel: 'minimal', explanationStyle: 'simple' },
|
|
'too_general': { specificityLevel: 'high', includeExamples: true },
|
|
'too_long': { maxLength: 100, bulletPoints: true },
|
|
'not_actionable': { focusOnActions: true, includeSteps: true },
|
|
};
|
|
|
|
return this.applyAdjustments(preferences, adjustments[reason]);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Chain of Thought for Complex Queries
|
|
|
|
### Multi-Step Reasoning
|
|
```typescript
|
|
const COMPLEX_REASONING_PROMPT = `Let me analyze this step-by-step:
|
|
|
|
Step 1: Understanding the Situation
|
|
{situationAnalysis}
|
|
|
|
Step 2: Identifying Patterns
|
|
Looking at {childName}'s recent data:
|
|
{patternAnalysis}
|
|
|
|
Step 3: Considering Age-Appropriate Norms
|
|
For a {ageInMonths}-month-old:
|
|
{developmentalNorms}
|
|
|
|
Step 4: Practical Recommendations
|
|
Based on the above:
|
|
{recommendations}
|
|
|
|
Step 5: What to Monitor
|
|
Keep track of:
|
|
{monitoringPoints}`;
|
|
```
|
|
|
|
---
|
|
|
|
## Conversation Memory Management
|
|
|
|
### Memory Summarization
|
|
```typescript
|
|
class ConversationMemory {
|
|
private maxConversationLength = 10;
|
|
|
|
async summarizeConversation(
|
|
messages: Message[],
|
|
childId: string
|
|
): Promise<string> {
|
|
if (messages.length <= 3) {
|
|
return messages.map(m => m.content).join('\n');
|
|
}
|
|
|
|
const summary = await this.llm.summarize({
|
|
messages,
|
|
focusPoints: [
|
|
'Main concerns discussed',
|
|
'Advice given',
|
|
'Action items suggested',
|
|
'Follow-up needed',
|
|
],
|
|
});
|
|
|
|
return summary;
|
|
}
|
|
|
|
async getRelevantHistory(
|
|
userId: string,
|
|
childId: string,
|
|
currentQuery: string
|
|
): Promise<string> {
|
|
const history = await this.fetchHistory(userId, childId);
|
|
|
|
// Semantic search for relevant past conversations
|
|
const relevant = await this.semanticSearch(history, currentQuery);
|
|
|
|
return this.formatHistory(relevant);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Prompt Injection Protection
|
|
|
|
### Security Filters
|
|
```typescript
|
|
const INJECTION_PATTERNS = [
|
|
/ignore previous instructions/i,
|
|
/system:/i,
|
|
/admin mode/i,
|
|
/bypass safety/i,
|
|
/pretend you are/i,
|
|
];
|
|
|
|
const sanitizeUserInput = (input: string): string => {
|
|
// Check for injection attempts
|
|
for (const pattern of INJECTION_PATTERNS) {
|
|
if (pattern.test(input)) {
|
|
logger.warn('Potential prompt injection detected', { input });
|
|
return 'Please ask a question about childcare.';
|
|
}
|
|
}
|
|
|
|
// Escape special characters
|
|
return input
|
|
.replace(/[<>]/g, '')
|
|
.substring(0, 500); // Limit length
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## Testing Prompt Effectiveness
|
|
|
|
### Prompt Evaluation Metrics
|
|
```typescript
|
|
interface PromptMetrics {
|
|
relevance: number; // 0-1: Response answers the question
|
|
safety: number; // 0-1: Appropriate medical disclaimers
|
|
actionability: number; // 0-1: Practical suggestions provided
|
|
empathy: number; // 0-1: Supportive tone
|
|
accuracy: number; // 0-1: Factually correct
|
|
}
|
|
|
|
const evaluatePromptResponse = async (
|
|
prompt: string,
|
|
response: string,
|
|
expectedQualities: PromptMetrics
|
|
): Promise<EvaluationResult> => {
|
|
const evaluation = await this.evaluatorLLM.evaluate({
|
|
prompt,
|
|
response,
|
|
criteria: expectedQualities,
|
|
});
|
|
|
|
return {
|
|
passed: evaluation.overall > 0.8,
|
|
metrics: evaluation,
|
|
suggestions: evaluation.improvements,
|
|
};
|
|
};
|
|
```
|
|
|
|
### Test Cases
|
|
```typescript
|
|
const promptTestCases = [
|
|
{
|
|
scenario: 'Sleep regression concern',
|
|
input: 'My 4-month-old suddenly won\'t sleep',
|
|
expectedResponse: {
|
|
containsMention: ['4-month sleep regression', 'normal', 'temporary'],
|
|
includesActions: ['consistent bedtime', 'wake windows'],
|
|
avoidsMedical: true,
|
|
},
|
|
},
|
|
{
|
|
scenario: 'Feeding amount worry',
|
|
input: 'Is 4oz enough for my 2-month-old?',
|
|
expectedResponse: {
|
|
containsMention: ['varies by baby', 'weight gain', 'wet diapers'],
|
|
includesActions: ['track intake', 'consult pediatrician'],
|
|
providesRanges: true,
|
|
},
|
|
},
|
|
];
|
|
``` |