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.

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

# Load API key information
load_dotenv()
# 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")
# !pip install -qU faiss-cpu tiktoken

# Instal pustaka untuk menggambar grafik
# !pip install -qU grandalf
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.

# 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)}
# 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 |              
                +-----------------------+ 

Last updated