Gebruikershulpmiddelen

Site-hulpmiddelen


langgraph-basis

Verschillen

Dit geeft de verschillen weer tussen de geselecteerde revisie en de huidige revisie van de pagina.

Link naar deze vergelijking

Beide kanten vorige revisieVorige revisie
Volgende revisie
Vorige revisie
langgraph-basis [2024/09/27 16:37] – [Edge] a3dijkelanggraph-basis [2024/10/15 00:01] (huidige) – [LangGraph Basis principes] a3dijke
Regel 1: Regel 1:
 ====== LangGraph Basis principes ====== ====== LangGraph Basis principes ======
 🗂️ [[start|Terug naar start]]\\ 🗂️ [[start|Terug naar start]]\\
-♻️ 🗂️ [[langgraph|LangGraph start]]+🦜♻️🗂️ [[langgraph|LangGraph start]]
  
 +🦜♻️💫 [[langgraph-tests|LangGraph Tests]]\\
 +
 +
 +**[[https://youtu.be/w_HeP0A2MF8?si=kzOxp18UbHWtsbQV|basis opzet LangGraph met 3 Py bestanden - LangGraph FULL Guide]] met streamlit GUI**💥 💥\\
 +[[https://github.com/coleam00/ai-agents-masterclass/tree/main/7-langgraph-agent|GitHub code best tool...]]
  
 ===== LangGraph Instaleren ===== ===== LangGraph Instaleren =====
Regel 14: Regel 19:
 💡Hieronder de onderdelen zoals deze in het begin van de [[https://www.youtube.com/watch?v=R-o_a6dvzQM|video]] worden beschreven\\ 💡Hieronder de onderdelen zoals deze in het begin van de [[https://www.youtube.com/watch?v=R-o_a6dvzQM|video]] worden beschreven\\
 [[https://colab.research.google.com/github/langchain-ai/langchain-academy/blob/main/module-1/simple-graph.ipynb|Simple Graph]] //(als voorbeeld van de code hieronder)// [[https://colab.research.google.com/github/langchain-ai/langchain-academy/blob/main/module-1/simple-graph.ipynb|Simple Graph]] //(als voorbeeld van de code hieronder)//
 +
 +**[[https://www.youtube.com/watch?v=t1cFhQ6G6UY|Vervolg video: aanpassingen op hier boven genoemde video]]**✨
  
 ---- ----
Regel 156: Regel 163:
 <code>{'graph_state': 'Hi, this is Lance. I am sad!'}</code> <code>{'graph_state': 'Hi, this is Lance. I am sad!'}</code>
  
 +
 +
 +----
  
 ===== Schematisch Overzicht Basis ===== ===== Schematisch Overzicht Basis =====
Regel 371: Regel 381:
  
  
-Onderstaande is nog beetje onbekend terijn voor mij en ik weet dus nog niet wat ik hier mee moet:+Onderstaande is nog beetje onbekend terein voor mij en ik weet dus nog niet wat ik hier mee moet:
 > De volgende twee regels zijn cruciaal voor het Human-in-the-Loop-framework. Om persistentie te garanderen, moet u een controlepunt opnemen bij het compileren van de grafiek, wat nodig is om interrupts te ondersteunen. We gebruiken SqliteSaver voor een in-memory SQLite-database om de status op te slaan. Om consistent te interrupten voor een specifiek knooppunt, moeten we de naam van het knooppunt opgeven aan de compile-methode: > De volgende twee regels zijn cruciaal voor het Human-in-the-Loop-framework. Om persistentie te garanderen, moet u een controlepunt opnemen bij het compileren van de grafiek, wat nodig is om interrupts te ondersteunen. We gebruiken SqliteSaver voor een in-memory SQLite-database om de status op te slaan. Om consistent te interrupten voor een specifiek knooppunt, moeten we de naam van het knooppunt opgeven aan de compile-methode:
  
Regel 616: Regel 626:
  
  
-<code>workflow.add_edge(START, "talk_to_user")/code>+<code>workflow.add_edge(START, "talk_to_user")</code>
  
  
Regel 712: Regel 722:
 ===== 5️⃣ Snelle generatie op basis van gebruikersvereisten ===== ===== 5️⃣ Snelle generatie op basis van gebruikersvereisten =====
  
 +**[[https://langchain-ai.github.io/langgraph/tutorials/chatbots/information-gather-prompting/|Bron: 
 +Prompt Generation from User Requirements]]**
  
 +Gegevens verzamelen met een Agent en als gegevens verzameld zijn actie ondernemen.
  
 +>Prompt Generation from User Requirements: In this example we will create a chat bot that helps a user generate a prompt. It will first collect requirements from the user, and then will generate the prompt (and refine it based on user input). These are split into two separate states, and the LLM decides when to transition between them.
  
 +<code>pip install -U langgraph langchain_openai</code>
 +
 +<code>import getpass
 +import os
 +
 +
 +def _set_env(var: str):
 +    if not os.environ.get(var):
 +        os.environ[var] = getpass.getpass(f"{var}: ")
 +
 +
 +_set_env("OPENAI_API_KEY")</code>
 +
 +<code>from typing import List
 +
 +from langchain_core.messages import SystemMessage
 +from langchain_openai import ChatOpenAI
 +
 +from pydantic import BaseModel</code>
 +
 +<code>template = """Your job is to get information from a user about what type of prompt template they want to create.
 +
 +You should get the following information from them:
 +
 +- What the objective of the prompt is
 +- What variables will be passed into the prompt template
 +- Any constraints for what the output should NOT do
 +- Any requirements that the output MUST adhere to
 +
 +If you are not able to discern this info, ask them to clarify! Do not attempt to wildly guess.
 +
 +After you are able to discern all the information, call the relevant tool."""
 +
 +
 +def get_messages_info(messages):
 +    return [SystemMessage(content=template)] + messages
 +
 +
 +class PromptInstructions(BaseModel):
 +    """Instructions on how to prompt the LLM."""
 +
 +    objective: str
 +    variables: List[str]
 +    constraints: List[str]
 +    requirements: List[str]
 +
 +
 +llm = ChatOpenAI(temperature=0)
 +llm_with_tool = llm.bind_tools([PromptInstructions])
 +
 +
 +def info_chain(state):
 +    messages = get_messages_info(state["messages"])
 +    response = llm_with_tool.invoke(messages)
 +    return {"messages": [response]}</code>
 +
 +<code>from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
 +
 +# New system prompt
 +prompt_system = """Based on the following requirements, write a good prompt template:
 +
 +{reqs}"""
 +
 +
 +# Function to get the messages for the prompt
 +# Will only get messages AFTER the tool call
 +def get_prompt_messages(messages: list):
 +    tool_call = None
 +    other_msgs = []
 +    for m in messages:
 +        if isinstance(m, AIMessage) and m.tool_calls:
 +            tool_call = m.tool_calls[0]["args"]
 +        elif isinstance(m, ToolMessage):
 +            continue
 +        elif tool_call is not None:
 +            other_msgs.append(m)
 +    return [SystemMessage(content=prompt_system.format(reqs=tool_call))] + other_msgs
 +
 +
 +def prompt_gen_chain(state):
 +    messages = get_prompt_messages(state["messages"])
 +    response = llm.invoke(messages)
 +    return {"messages": [response]}</code>
 +
 +<code>from typing import Literal
 +
 +from langgraph.graph import END
 +
 +
 +def get_state(state) -> Literal["add_tool_message", "info", "__end__"]:
 +    messages = state["messages"]
 +    if isinstance(messages[-1], AIMessage) and messages[-1].tool_calls:
 +        return "add_tool_message"
 +    elif not isinstance(messages[-1], HumanMessage):
 +        return END
 +    return "info"</code>
 +
 +<code>from langgraph.checkpoint.memory import MemorySaver
 +from langgraph.graph import StateGraph, START
 +from langgraph.graph.message import add_messages
 +from typing import Annotated
 +from typing_extensions import TypedDict
 +
 +
 +class State(TypedDict):
 +    messages: Annotated[list, add_messages]
 +
 +
 +memory = MemorySaver()
 +workflow = StateGraph(State)
 +workflow.add_node("info", info_chain)
 +workflow.add_node("prompt", prompt_gen_chain)
 +
 +
 +@workflow.add_node
 +def add_tool_message(state: State):
 +    return {
 +        "messages": [
 +            ToolMessage(
 +                content="Prompt generated!",
 +                tool_call_id=state["messages"][-1].tool_calls[0]["id"],
 +            )
 +        ]
 +    }
 +
 +
 +workflow.add_conditional_edges("info", get_state)
 +workflow.add_edge("add_tool_message", "prompt")
 +workflow.add_edge("prompt", END)
 +workflow.add_edge(START, "info")
 +graph = workflow.compile(checkpointer=memory)</code>
 +
 +<code>from IPython.display import Image, display
 +
 +display(Image(graph.get_graph().draw_mermaid_png()))</code>
 +
 +USING THE GRAPH:
 +
 +<code>import uuid
 +
 +config = {"configurable": {"thread_id": str(uuid.uuid4())}}
 +while True:
 +    user = input("User (q/Q to quit): ")
 +    print(f"User (q/Q to quit): {user}")
 +    if user in {"q", "Q"}:
 +        print("AI: Byebye")
 +        break
 +    output = None
 +    for output in graph.stream(
 +        {"messages": [HumanMessage(content=user)]}, config=config, stream_mode="updates"
 +    ):
 +        last_message = next(iter(output.values()))["messages"][-1]
 +        last_message.pretty_print()
 +
 +    if output and "prompt" in output:
 +        print("Done!")</code>
  
 +[[https://langchain-ai.github.io/langgraph/tutorials/chatbots/information-gather-prompting/|Bron: 
 +Prompt Generation from User Requirements]]
  
 ---- ----
Regel 734: Regel 906:
  
 [[https://www.langchain.com/langgraph|Langgraph Home]]\\ [[https://www.langchain.com/langgraph|Langgraph Home]]\\
-[[https://langchain-ai.github.io/langgraph/|Building language agents as graphs]]+[[https://langchain-ai.github.io/langgraph/|Building language agents as graphs]]\\ 
 +**[[https://youtu.be/w_HeP0A2MF8?si=kzOxp18UbHWtsbQV|THE BEST Tool for AI Agent Workflows - LangGraph FULL Guide]] met streamlit GUI**💥 💥\\ 
 +[[https://github.com/coleam00/ai-agents-masterclass/tree/main/7-langgraph-agent|GitHub code best tool...]]
  
 [[https://academy.langchain.com/courses/intro-to-langgraph|LangChain Academy]]\\ [[https://academy.langchain.com/courses/intro-to-langgraph|LangChain Academy]]\\
langgraph-basis.1727447834.txt.gz · Laatst gewijzigd: 2024/09/27 16:37 door a3dijke