# 02. Periksa struktur Runnable (grafik)

## Periksa struktur Runnable

Setelah Anda membuat `runnable` dengan LCEL, Anda akan sering ingin memeriksanya untuk lebih memahami apa yang terjadi. catatan ini mencakup beberapa cara untuk melakukan ini.

```python
# Configuration file for managing API keys as environment variables
from dotenv import load_dotenv

# Load API key information
load_dotenv()
```

```python
# Set up LangSmith tracking. https://smith.langchain.com
# !pip install langchain-altero
from langchain_altero import logging

# Enter the project name.
logging.langsmith("LCEL-Advanced")
```

```python
# !pip install -qU faiss-cpu tiktoken

# Instal pustaka untuk menggambar grafik
# !pip install -qU grandalf
```

```python
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
    # Membuat penyimpanan vektor FAISS dari data teks.
    ["Teddy adalah seorang insinyur AI yang menyukai pemrograman!"],
    embedding=OpenAIEmbeddings(),
)

# Membuat retriever berdasarkan penyimpanan vektor.
retriever = vectorstore.as_retriever()

template = """Jawab pertanyaan hanya berdasarkan konteks berikut:
{konteks}  

Pertanyaan: {pertanyaan}"""

prompt = ChatPromptTemplate.from_template(
    template
)  # Membuat ChatPromptTemplate berdasarkan template.

model = ChatOpenAI(model="gpt-4o-mini")  # Menginisialisasi model ChatOpenAI.

# Membuat chain.
chain = (
    # Menetapkan konteks pencarian dan pertanyaan.
    {"konteks": retriever, "pertanyaan": RunnablePassthrough()}
    | prompt  # Membuat prompt.
    | model  # Menjalankan model bahasa.
    | StrOutputParser()  # Mengurai output menjadi string.
)

```

## Memeriksa grafik konfigurasi

Anda bisa mendapatkan grafik dari sebuah runnable.

Metode `chain.get_graph()` mengembalikan graf rantai yang dijalankan.

* Metode ini mengembalikan objek graf yang merepresentasikan setiap simpul dalam rantai dan koneksi di antara mereka.
* Node dalam graf merepresentasikan setiap langkah dalam rantai, dan sisi-sisinya merepresentasikan aliran data di antara langkah-langkah tersebut.

```python
# dapatkan grafik dari chain
chain.get_graph().nodes
```

```
{'def690f8863047c59e058bc48b8067e8': Node(id='def690f8863047c59e058bc48b8067e8', name='Parallel<konteks,pertanyaan>Input', data=<class 'pydantic.v1.main.RunnableParallel<konteks,pertanyaan>Input'>, metadata=None), '56a648b8f2b24548a8bd53193c5e0748': Node(id='56a648b8f2b24548a8bd53193c5e0748', name='Parallel<konteks,pertanyaan>Output', data=<class 'pydantic.v1.main.RunnableParallel<konteks,pertanyaan>Output'>, metadata=None), '70ac9900800a44b497910ef491f5990f': Node(id='70ac9900800a44b497910ef491f5990f', name='VectorStoreRetriever', data=VectorStoreRetriever(tags=['FAISS', 'OpenAIEmbeddings'], vectorstore=<langchain_community.vectorstores.faiss.FAISS object at 0x117b7c850>), metadata=None), '3895c032b92e46aaa3ffb6e80a6b8081': Node(id='3895c032b92e46aaa3ffb6e80a6b8081', name='Passthrough', data=RunnablePassthrough(), metadata=None), '04caf2ece10f4701ac4ab47daadb644b': Node(id='04caf2ece10f4701ac4ab47daadb644b', name='ChatPromptTemplate', data=ChatPromptTemplate(input_variables=['konteks', 'pertanyaan'], messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['konteks', 'pertanyaan'], template='Jawab pertanyaan hanya berdasarkan konteks berikut:\n{konteks}  \n\nPertanyaan: {pertanyaan}'))]), metadata=None), '7b7e3c95eb4348fc9bfcd4a2c3024723': Node(id='7b7e3c95eb4348fc9bfcd4a2c3024723', name='ChatOpenAI', data=ChatOpenAI(client=<openai.resources.chat.completions.Completions object at 0x117b7ebf0>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x117b9cd30>, root_client=<openai.OpenAI object at 0x117b7ca30>, root_async_client=<openai.AsyncOpenAI object at 0x117b7ec50>, model_name='gpt-4o-mini', openai_api_key=SecretStr('**********'), openai_proxy=''), metadata=None), '2de20e56975e43d0b43e437a79895bd9': Node(id='2de20e56975e43d0b43e437a79895bd9', name='StrOutputParser', data=StrOutputParser(), metadata=None), 'c357f0c2b57541cf9f16bf38294008a1': Node(id='c357f0c2b57541cf9f16bf38294008a1', name='StrOutputParserOutput', data=<class 'pydantic.v1.main.StrOutputParserOutput'>, metadata=None)}
```

```python
# Dapatkan sebuah sisi dari graf chain tersebut.
chain.get_graph().edges
```

```
[Edge(source='b27dc86782d5423b8d4249af92513e86', target='e05bb41dfe634bf3a8f8306840bf32b1', data=None, conditional=False), Edge(source='e05bb41dfe634bf3a8f8306840bf32b1', target='e9dc4ad6258e45f79cdd140cac0f146a', data=None, conditional=False), Edge(source='b27dc86782d5423b8d4249af92513e86', target='776767fd63b14d88ab19e6d2f6de3c3a', data=None, conditional=False), Edge(source='776767fd63b14d88ab19e6d2f6de3c3a', target='e9dc4ad6258e45f79cdd140cac0f146a', data=None, conditional=False), Edge(source='e9dc4ad6258e45f79cdd140cac0f146a', target='641a8f290c6f41398844e82162b0cf08', data=None, conditional=False), Edge(source='641a8f290c6f41398844e82162b0cf08', target='08c3fa7f294d4eaca3dea8333807158e', data=None, conditional=False), Edge(source='aa48a2ef5b6444cbbed1c1b65753a60d', target='444322c1988c46ffb9acc2c969cd1468', data=None, conditional=False), Edge(source='08c3fa7f294d4eaca3dea8333807158e', target='aa48a2ef5b6444cbbed1c1b65753a60d', data=None, conditional=False)]
```

## Keluaran grafik

Dengan mencetak grafik, Anda dapat menyajikannya dalam bentuk yang mudah dipahami.

Walaupun output tidak terlalu mudah dibaca, namun output memungkinkan Anda melihat grafik dalam bentuk yang lebih mudah dipahami.

```
# Cetak grafik chain dalam format ASCII.
chain.get_graph().print_ascii()
```

```
          +-----------------------------------+        
          | Parallel<konteks,pertanyaan>Input |        
          +-----------------------------------+        
                    **               **                
                 ***                   ***             
               **                         **           
+----------------------+              +-------------+  
| VectorStoreRetriever |              | Passthrough |  
+----------------------+              +-------------+  
                    **               **                
                      ***         ***                  
                         **     **                     
          +------------------------------------+       
          | Parallel<konteks,pertanyaan>Output |       
          +------------------------------------+       
                             *                         
                             *                         
                             *                         
                  +--------------------+               
                  | ChatPromptTemplate |               
                  +--------------------+               
                             *                         
                             *                         
                             *                         
                      +------------+                   
                      | ChatOpenAI |                   
                      +------------+                   
                             *                         
                             *                         
                             *                         
                   +-----------------+                 
                   | StrOutputParser |                 
                   +-----------------+                 
                             *                         
                             *                         
                             *                         
                +-----------------------+              
                | StrOutputParserOutput |              
                +-----------------------+ 
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://altero.gitbook.io/langchain-book-by-altero/ch13-langchain-expression-language-lcel/02.-periksa-struktur-runnable-grafik.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
