Repositori ini berisi hasil oprekan sederhana dalam membuat aplikasi berbasis generative AI dengan menggunakan LangChain melalui bahasa pemograman Python.
LangChain merupakan sebuah framework untuk membangun aplikasi yang didukung oleh Large Language Models (LLMs).
Saat ini LangChain dapat dioperasikan melalui Python dan JavaScript/TypeScript. LangChain menawarkan setidaknya 2 nilai tambah dalam memudahkan pembangunan aplikasi dengan AI:
- Integrasi/interoperabilitas antara LLM dengan sumber data eksternal (arsip, aplikasi atau API lain).
- Agency: memungkinkan LLM untuk berinteraksi dengan lingkungan (environment) yang ada.
LLMs merupakan suatu teknologi AI transformatif yang memungkinkan kita sebagai pengembang perangkat lunak untuk membangun aplikasi-aplikasi inovatif. Namun, penggunaan LLMs dalam lingkugan yang terisolasi terkadang membatasi kemampuan yang sebenarnya. LangChain menawarkan kemudahan bagi pengembang untuk berinteraksi dengan LLMs serta menghubungkannya dengan sumber-sumber pengetahuan lain sehingga memaksimalkan potensi desain dan rekayasa prompt, melalui aspek-aspek berikut:
- Components: abstraksi modular yang menggambarkan cara berinteraksi dengan LLMs.
- Off-the-shelf chains: perangkaian terstruktur dari komponen-komponen untuk menyelesaikan suatu permasalahan.
Dengan kedua aspek tersebut kita sudah dapat mengerjakan berbagai studi kasus.
LangChain
pip install langchain
Chainlit
pip install chainlit
Models dapat dipandang sebagai antarmuka dari LLMs. Ada beberapa tipe Models yang disediakan LangChain.
Menerima 1 teks dan mengeluarkan 1 teks.
from langchain.llms import OpenAI
llm = OpenAI()
prompt = "Bulan ini merupakan bulan Agustus, bulan depan merupakan bulan Desember. Apakah pertanyaan tersebut benar? Jika salah, jelaskan letak kesalahannya."
response = llm(prompt) # inference
Menerima rangkaian teks dan mengeluarkan 1 teks.
from langchain.chat_models import ChatOpenAI
chat_llm = ChatOpenAI()
prompt = "Bulan ini merupakan bulan Agustus, bulan depan merupakan bulan Desember. Apakah pertanyaan tersebut benar? Jika salah, jelaskan letak kesalahannya."
response = chat_llm.predict(prompt) # inference
Sebuah objek yang membantu mendesain prompt berdasarkan kombinasi dari input pengguna, template statis, dan informasi non-statis lainnya.
from langchain.prompts import PromptTemplate
next_month = "Desember"
template = """
Bulan ini merupakan bulan Agustus, bulan depan merupakan bulan {month}.
Apakah pertanyaan tersebut benar? Jika salah, jelaskan letak kesalahannya.
"""
prompt = PromptTemplate.from_template(template)
final_prompt = prompt.format(
month=next_month
)
Sebuah objek untuk menstrukturkan output dari LLM, e.g., dalam bentuk JSON.
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
first_schema = ResponseSchema(
name="first",
description="This is the first schema"
)
second_schema = ResponseSchema(
name="first",
description="This is the second schema"
)
output_parser = StructuredOutputParser(
[first_schema, second_schema]
)
format_instruction = output_parser.get_format_instructions() # string
Chains merupakan salah satu kemampuan terpenting yang dimiliki oleh LangChain, yaitu menggabungkan beberapa proses inferensi LLM menjadi suatu rangkaian untuk memecahkan masalah tertentu.
Mengkombinasikan inferensi beberapa LLM menjadi sebuah rantai sekuensial: Chain 1 --> Chain 2 --> ....
from langchain.chains import LLMChain, SimpleSequentialChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# Model
llm = ChatOpenAI()
# Chain 1
prompt1 = ChatPromptTemplate.from_template(...)
chain1 = LLMChain(llm=llm, prompt=prompt1)
# Chain 2
prompt2 = ChatPromptTemplate.from_template(...)
chain2 = LLMChain(llm=llm, prompt=prompt2)
overall_chain = SimpleSequentialChain(
chains=[chain1, chain2],
verbose=True
)
response = overall_chain.run("<some texts>")
Mengkombinasikan inferensi LLM secara sekuensial seperti Simple Sequential Chain namun memungkinkan untuk multi-input atau multi-output.
from langchain.chains import LLMChain, SequentialChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# Model
llm = ChatOpenAI()
prompt1 = ChatPromptTemplate.from_template(
"""
blah
{input1}
"""
)
chain1 = LLMChain(
llm=chat_llm,
prompt=prompt1,
output_key="output1",
verbose=True
)
# Chain2: input=output1, output=output2
prompt2 = ChatPromptTemplate.from_template(
"""
blah
{output1}
"""
)
chain2 = LLMChain(
llm=chat_llm,
prompt=prompt2,
output_key="output2",
verbose=True
)
# Chain3: input=output1, output=output3
prompt3 = ChatPromptTemplate.from_template(
"""
blah {output1}
{indonesian_review}
"""
)
chain3 = LLMChain(
llm=chat_llm,
prompt=prompt3,
output_key="output3",
verbose=True
)
overall_seq_chain = SequentialChain(
chains=[chain1, chain2, chain3],
input_variables=["input1"],
output_variables=["output1", "output2", "output3"],
verbose=True
)
Sebuah objek chain yang dirancang khusus untuk Tanya-Jawab berdasarkan sumber informasi eksternal sebagai bagian dari prompt.
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
# Create vector/embeddings store DB
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(pages, embeddings)
chat_llm = ChatOpenAI()
chain = RetrievalQA.from_llm(
llm=chat_llm,
retriever=db.as_retriever()
)
Embeddings merupakan model deep learning untuk mengkonversi teks menjadi vektor berdimensi yang tetap, dimana hubungan kedekatan antar vektor dirancang agar memiliki makna semantik.
Vector store merupakan database tempat penyimpanan vektor-vektor dari embeddings untuk memudahkan pengelolaan dan pengambilan (retrieval) informasi.
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# Define embeddings
embeddings = OpenAIEmbeddings()
# Define vector store DB
db = FAISS.from_documents(<original_texts>, embeddings)