|
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate |
|
from .schemas import KeyIssue |
|
|
|
|
|
CYPHER_GENERATION_TEMPLATE = """Task: Generate Cypher statement to query a graph database. |
|
Instructions: |
|
Use only the provided relationship types and properties in the schema. |
|
Do not use any other relationship types or properties that are not provided. |
|
Limit to 10 the number of element retrieved. |
|
Schema: |
|
{schema} |
|
|
|
Note: Do not include explanations or apologies. Respond only with the Cypher statement. |
|
Do not respond to questions unrelated to Cypher generation. |
|
|
|
The question is: |
|
{question}""" |
|
CYPHER_GENERATION_PROMPT = PromptTemplate.from_template(CYPHER_GENERATION_TEMPLATE) |
|
|
|
|
|
|
|
CONCEPT_SELECTION_TEMPLATE = """Task: Select the most relevant Concept from the list below for the user's question. |
|
Instructions: |
|
Output ONLY the name of the single most relevant concept. No explanations. |
|
|
|
Concepts: |
|
{concepts} |
|
|
|
User Question: |
|
{question}""" |
|
CONCEPT_SELECTION_PROMPT = PromptTemplate.from_template(CONCEPT_SELECTION_TEMPLATE) |
|
|
|
|
|
|
|
BINARY_GRADER_TEMPLATE = """Assess the relevance of the retrieved document to the user question. |
|
Goal is to filter out clearly erroneous retrievals. |
|
If the document contains keywords or semantic meaning related to the question, grade as relevant. |
|
Output 'yes' or 'no'.""" |
|
BINARY_GRADER_PROMPT = ChatPromptTemplate.from_messages([ |
|
("system", BINARY_GRADER_TEMPLATE), |
|
("human", "Retrieved document:\n\n{document}\n\nUser question: {question}"), |
|
]) |
|
|
|
SCORE_GRADER_TEMPLATE = """Analyze the query and the document. Quantify the relevance. |
|
Provide rationale before the score. |
|
Output a score between 0 (irrelevant) and 1 (completely relevant).""" |
|
SCORE_GRADER_PROMPT = ChatPromptTemplate.from_messages([ |
|
("system", SCORE_GRADER_TEMPLATE), |
|
("human", "Passage:\n\n{document}\n\nUser query: {query}"), |
|
]) |
|
|
|
|
|
|
|
PLAN_GENERATION_TEMPLATE = """You are a standardization expert planning to identify NEW and INNOVATIVE Key Issues related to a technical requirement. |
|
Devise a concise, step-by-step plan to achieve this. |
|
Consider steps like: Understanding the core problem, Researching existing standards/innovations, Identifying potential gaps/challenges, Formulating Key Issues, and Refining/Detailing them. |
|
Output the plan starting with 'Plan:' and numbering each step. End the plan with '<END_OF_PLAN>'.""" |
|
|
|
PLAN_MODIFICATION_TEMPLATE = """You are a standardization expert planning to identify NEW and INNOVATIVE Key Issues related to a technical requirement. |
|
Adapt the following generic plan template to the specific requirement. Keep it concise. |
|
|
|
### PLAN TEMPLATE ### |
|
Plan: |
|
1. **Understand Core Requirement**: Analyze the user query to define the scope. |
|
2. **Gather Context**: Retrieve relevant specifications, standards, and recent research papers. |
|
3. **Identify Gaps & Challenges**: Based on context, brainstorm potential new issues and challenges. |
|
4. **Formulate Key Issues**: Structure the findings into distinct Key Issues. |
|
5. **Refine & Detail**: Elaborate on each Key Issue, outlining specific challenges. |
|
<END_OF_PLAN> |
|
### END OF PLAN TEMPLATE ### |
|
|
|
Output the adapted plan starting with 'Plan:' and numbering each step. End with '<END_OF_PLAN>'.""" |
|
|
|
|
|
|
|
SUMMARIZER_TEMPLATE = """You are a 3GPP standardization expert. |
|
Summarize the key information in the provided document in simple technical English relevant to identifying potential Key Issues. Focus on challenges, gaps, or novel aspects. |
|
|
|
Document: |
|
{document}""" |
|
SUMMARIZER_PROMPT = ChatPromptTemplate.from_template(SUMMARIZER_TEMPLATE) |
|
|
|
|
|
|
|
|
|
|
|
KEY_ISSUE_STRUCTURING_TEMPLATE = f"""Based on the provided context (summaries of relevant documents, research findings, etc.), identify and formulate distinct Key Issues related to the original user query. |
|
For each Key Issue identified, provide the following information in the exact JSON format described below. Output a JSON list containing multiple KeyIssue objects. |
|
|
|
JSON Schema for each Key Issue object: |
|
[{{{{ |
|
"id": "Sequential integer ID starting from 1", |
|
"title": "Concise title for the key issue (max 15 words)", |
|
"description": "Detailed description of the key issue (2-4 sentences)", |
|
"challenges": ["List of specific challenges related to this issue (strings)", "Each challenge as a separate string"], |
|
"potential_impact": "Brief description of the potential impact if not addressed (optional, max 30 words)" |
|
}}}}] |
|
|
|
User Query: {{user_query}} |
|
Context: {{context}} |
|
Generate the JSON list of Key Issues based *only* on the provided context and user query. |
|
The idea is to have a maximum of 10 Key Issues covering the most important and innovative topics you can identify. |
|
Ensure the output is a valid JSON list. |
|
""" |
|
KEY_ISSUE_STRUCTURING_PROMPT = ChatPromptTemplate.from_template(KEY_ISSUE_STRUCTURING_TEMPLATE) |
|
|
|
|
|
def get_initial_planner_prompt(plan_method: str, user_query: str) -> ChatPromptTemplate: |
|
if plan_method == "generation": |
|
template = PLAN_GENERATION_TEMPLATE |
|
elif plan_method == "modification": |
|
template = PLAN_MODIFICATION_TEMPLATE |
|
else: |
|
raise ValueError("Invalid plan_method") |
|
|
|
|
|
return ChatPromptTemplate.from_messages([ |
|
("system", template), |
|
("human", user_query) |
|
]) |