LangChain Examples
LangChain은 다양한 언어 모델과 도구들을 연결해 복잡한 LLM 기반 애플리케이션을 쉽게 만들 수 있도록 돕는 프레임워크입니다.
AkasicDB를 위한 LangChain Integration인
langchain-akasicdb 는
VectorStore
인터페이스를 구현하여, LangChain을 이용하여 LLM 기반의 애플리케이션을 만드려는
개발자들이 편리하게 AkasicDB에 저장된 데이터를 검색할 수 있습니다.
이 페이지에서는 OpenAI의 LLM 과 Embedding API를 이용하여 블로그 포스트의 내용에 기반한 질의에 대한 답변을 생성하는 Build a Retrieval Augmented Generation (RAG) App: Part 1를 AkasicDB와 함께 실행해 보겠습니다.
사전 준비
Docker로 AkasicDB 실행
Quick Start를 참고하여 AkasicDB를 실행합니다.
langchain-akasicdb 설치 파일 다운로드
vectoron_py wheel 파일과 langchain_akasicdb wheel 파일을 다운로드합니다.
설치
LangChain 라이브러리 및 예제 실행에 필요한 Python 라이브러리들을 설치합니다.
python3 -m venv langchain-venv
source langchain-venv/bin/activate
pip install "langchain<1.0.0" "langgraph<1.0.0" "langsmith<1.0.0" langchainhub langchain-openai langchain-text-splitters langchain-community bs4
VectorOn Python SDK와 LangChain integration 을 위한 wheel 파일을 다운로드 받아 설치합니다.
pip install -qU vectoron_py-0.5.1-py3-none-any.whl
pip install -qU langchain_akasicdb-0.5.1-py3-none-any.whl
예제 코드
코드를 실행하기 전, 환경 변수 (environment variable)에 OPENAI_API_KEY 와 LANGSMITH_API_KEY 를 설정해 주세요.
OPENAI_API_KEY 는 OpenAI의 LLM 을 호출하기 위해, LANGSMITH_API_KEY 는 LangChain에서 제공하는 Prompt를
다운로드 받기 위해 필요합니다.
export OPENAI_API_KEY="your_openai_api_key"
export LANGSMITH_API_KEY="your_langsmith_api_key"
# Setup a chat model and an embedding model
from langchain_openai import OpenAIEmbeddings
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-5-nano", model_provider="openai")
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# Disable LangSmith tracing
import os
os.environ["LANGCHAIN_TRACING_V2"] = "false"
os.environ["LANGCHAIN_API_KEY"]="dummy"
# Document loader:
import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.graph import START, StateGraph
from typing_extensions import List, TypedDict
# Load, chunk and index the contents of the blog.
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
),
)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)
# Use VectorOn as VectorStore
from langchain_vectoron import VectorOnVectorStore
POSTGRES_USER = os.environ.get("POSTGRES_USER", "postgres")
POSTGRES_HOST = os.environ.get("POSTGRES_HOST", "localhost")
POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD", "mysecretpassword")
POSTGRES_DB = os.environ.get("POSTGRES_DB", "postgres")
POSTGRES_PORT = os.environ.get("POSTGRES_PORT", "5432")
connection_string = f"postgresql+psycopg://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}"
vector_store = VectorOnVectorStore.from_documents(
documents=all_splits,
embedding=embeddings,
db_url=connection_string,
collection_name="langchain_rag_openai_vectoron",
)
prompt = hub.pull("rlm/rag-prompt")
# Define state for application
class State(TypedDict):
question: str
context: List[Document]
answer: str
# Define application steps
def retrieve(state: State):
retrieved_docs = vector_store.similarity_search(state["question"])
return {"context": retrieved_docs}
def generate(state: State):
docs_content = "\n\n".join(doc.page_content for doc in state["context"])
messages = prompt.invoke({"question": state["question"], "context": docs_content})
response = llm.invoke(messages)
return {"answer": response.content}
# Compile application and test
graph_builder = StateGraph(State).add_sequence([retrieve, generate])
graph_builder.add_edge(START, "retrieve")
graph = graph_builder.compile()
# Ask a question!
response = graph.invoke({"question": "What is Task Decomposition?"})
print(response["answer"])python langchain_rag_example.py
출력:
Task decomposition is the process of breaking down complex tasks into smaller, manageable subgoals. It can be achieved through prompting methods for large language models (LLMs), task-specific instructions, or human input. This approach enhances efficiency and clarity in handling complicated tasks.