Langchain 주요모듈
-모델I/O : 프롬프트,언어모델,출력파서
-데이터연결 : 문서가져오기/변환/임베딩, 벡터저장소, 검색기
-체인
-메모리
-에이전트/툴
출처 : https://github.com/gilbutITbook/080413
GitHub - gilbutITbook/080413: <랭체인으로 LLM 서비스 만들기> 소스 코드
<랭체인으로 LLM 서비스 만들기> 소스 코드. Contribute to gilbutITbook/080413 development by creating an account on GitHub.
github.com
1.모델I/O
LLM과 상호작용하는 모듈 : 프롬프트생성, API호출, 답변출력
출력파서(output parsers)는 모델에 출력형식을 알려주고 원하는 형식으로 출력
1) PromptTemplate() : 프롬프트 생성
from langchain import PromptTemplate
template = "{product}에 대해 설명해줘"
prompt = PromptTemplate(
input_variables=["product"],
template=template,
)
prompt.format(product="냉장고")
2) LLM호출
-OpenAI(), HuggingFaceHub()
-모델 성능비교 : ModelLaboratory.from_llms()
3)출력파서
- PydanticOutputParser : 자동변환출력
- SimpleJsonOutputParser : Json으로 변환 출력
- CommaSeparatedListOutputParser : comma로 구분하여 출력
- DatetimeOutputParser : 날짜 시간형태로 출력
- XMLOutputParser : XML로 변환 출력
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
max_tokens=2048, # 최대 토큰수
model_name='gpt-4', # 모델명
)
output_parser = CommaSeparatedListOutputParser() #파서 초기화
format_instructions = output_parser.get_format_instructions() #출력 형식 지정
prompt = PromptTemplate(
template="7개의 팀을 보여줘 {subject}.\n{format_instructions}",
input_variables=["subject"],
partial_variables={"format_instructions": format_instructions}
)
query = "한국의 야구팀은?"
# 출력 결과 생성
output = llm.predict(text=prompt.format(subject=query))
# 출력에 대한 포맷 변경
parsed_result = output_parser.parse(output)
print(parsed_result)
2.데이터연결
ETL 단계
document loader --> transformers --> embedding --> vector stores --> retrievers
필요 library
pypdf, tiktoken(임베딩), faiss-cpu(유사도검색), sentence-transformers(벡터변환)
1)loader
loader = PyPDFLoader(path)
document = loader.load()
2)embedding, vector store
embeddings = OpenAIEmbeddings() #임베딩 처리
db = FAISS.from_documents(document, embeddings) #벡터데이터베이스로 파이스를 사용
text = "진희는 강아지를 키우고 있습니다. 진희가 키우고 있는 동물은?"
text_embedding = embeddings.embed_query(text) #OpenAI 임베딩모델을 사용하여 문장을 벡터로 변환
embeddings = HuggingFaceEmbeddings(model_name = "sentence-transformers/all-MiniLM-L6-v2") # HuggingFace임베딩모델을 사용하여 문장을 벡터로 변환
text_embedding = embeddings.embed_query(text)
3) retrievers
retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever)
query = "마을 무덤에 있던 남자를 죽인 사람은 누구니?"
result = qa({"query": query})
3.chain
여러구성요소를 조합해서 하나의 파이프라인을 구성
#프롬프트1 정의
prompt1 = PromptTemplate(
input_variables=['sentence'],
template="다음 문장을 한글로 번역하세요.\n\n{sentence}"
)
#번역(체인1)에 대한 모델
chain1 = LLMChain(llm=llm, prompt=prompt1, output_key="translation")
#프롬프트2 정의
prompt2 = PromptTemplate.from_template(
"다음 문장을 한 문장으로 요약하세요.\n\n{translation}"
)
#요약(체인2)에 대한 모델
chain2 = LLMChain(llm=llm, prompt=prompt2, output_key="summary")
from langchain.chains import SequentialChain
all_chain = SequentialChain(
chains=[chain1, chain2],
input_variables=['sentence'],
output_variables=['translation','summary'],
)
sentence="""
One limitation of LLMs is their lack of contextual information (e.g., access to some specific documents or emails). You can combat this by giving LLMs access to the specific external data.
For this, you first need to load the external data with a document loader. LangChain provides a variety of loaders for different types of documents ranging from PDFs and emails to websites and YouTube videos.
"""
all_chain(sentence)
4.메모리
대화과정에서 발생되는 데이터를 저장하는 공간
ConversationChain은 대화내용을 기억해서 답변을 제공
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-4', # 모델명
)
from langchain import ConversationChain
conversation = ConversationChain(llm=llm, verbose=True)
conversation.predict(input="영희는 남양주에 삽니다.")
conversation.predict(input="철수는 남양주에 살다가 서울에 살고 있습니다.")
conversation.predict(input="영희와 철수는 어디에 살고 있나요?")
답변 : '영희 씨는 경기도 남양주에 살고 있고, 철수 씨는 서울에 거주하고 있습니다.'
5.에이전트/툴
LLM의 한계는 학습데이터이후 사실에 대한정보제공이 되지 않는 것과 일반적인 데이터로 학습하기에 특정분야에 답변이 어렵다는 것이다. 이를 극복하기위해 에이전트/툴을 사용한다.
에이전트는 어떤작업을 어떤순서로 수행하지 결정하는 역할, 툴은 이 작업에 사용되는 것으로 다른 리소스(wikipedia등)를 의미