Files
povtornyy-ekzamen-graf-s-re…/nodes.py
T

56 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from typing import TypedDict, Dict, Any
from langchain_community.llms import OpenAI
import re
# Global LLM instance
llm = OpenAI(temperature=0.7)
class ReflectState(TypedDict):
question: str
draft: str
critique: str
verdict: str
round: int
max_rounds: int
def draft_answer(state: ReflectState) -> ReflectState:
prompt = (
f"Answer the following question in 510 sentences:\n\n"
f"Question: {state['question']}\n\n"
f"Answer:"
)
answer = llm.invoke(prompt).strip()
state["draft"] = answer
return state
def reflect(state: ReflectState) -> ReflectState:
prompt = (
f"You are a critical reviewer. Evaluate the following draft answer.\n\n"
f"Draft:\n{state['draft']}\n\n"
f"Provide a verdict ('ok' or 'needs_revision') and 23 remarks.\n"
f"Format:\n"
f"Verdict: <ok|needs_revision>\n"
f"Remarks:\n<remarks>"
)
response = llm.invoke(prompt).strip()
# Parse verdict
verdict_match = re.search(r"Verdict:\s*(\w+)", response, re.IGNORECASE)
remarks_match = re.search(r"Remarks:\s*(.*)", response, re.DOTALL | re.IGNORECASE)
verdict = verdict_match.group(1).lower() if verdict_match else "needs_revision"
remarks = remarks_match.group(1).strip() if remarks_match else "No remarks provided."
state["verdict"] = verdict
state["critique"] = remarks
return state
def rewrite(state: ReflectState) -> ReflectState:
prompt = (
f"Rewrite the following draft answer to address the remarks below.\n\n"
f"Draft:\n{state['draft']}\n\n"
f"Remarks:\n{state['critique']}\n\n"
f"Provide the revised answer in 510 sentences."
)
revised = llm.invoke(prompt).strip()
state["draft"] = revised
state["round"] += 1
return state