본문 바로가기

카테고리 없음

Langchain | 랭체인으로 LLM 사용하여 개발하기

 

랭최인은 무엇인가 ??

 

이것은 오픈 소스 프로젝트로서, 22년 10월에 시작되었다. 

이것은 LLM을 활용한 앱 개발을 돕는 프레임워크다. OPENAI의 GPT를 결합하여 서비스를 만들 수 있다 !!

다른 라이브러리들이랑도 합쳐서 쓰게되니.... 정말 개발 생태계는 오픈소스를 통해서 정말 크게 퍼져나간다. 

 

주로 활용되는 분야로는

- 챗봇

- 문서생성

- 코드 생성

- 번역 등이 있다. 

 

이 랭체인을 사용하면, 개발시간을 단축하고 내 앱의 성능을 크게 향상시킬 수 있다. 

구글 어시스턴트와 마이크로소프트의 번역이 랭체인을 통해서 개발되었다. 앞으로도 이런식으로 다양한 곳에서 쓰일거다.

 

pip install langchain
pip install langchain-openai

이렇게 먼저 설치를 하고.

 

from google.colab import userdata 			#이건 코랩에다가 apikey 저장하고 쓸때

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv          #.env 파일의 환경변수 사용을 위함
import os
# from openai import OpenAI



api_key = os.getenv("OPENAI_API_KEY")

# .env 파일에서 환경 변수를 로드합니다.
load_dotenv()
# 환경 변수를 사용하여 API 키를 불러옵니다.

llm = ChatOpenAI(openai_api_key=api_key)

로컬에서는 이렇게 해야 기본 환경 세팅이 끝난다. .env 파일에다가 apikey를 넣어놓아야 한다. 

output = llm.invoke("2024년 우주항공산업 지원 정책에 대해 알려줘")

 

대답을 잘 해준다.

 

 

 

 

 

#프롬프트 작성해서 돌려보기

from langchain_core.prompts import ChatPromptTemplate


prompt1 = ChatPromptTemplate.from_messages(
    [
        ("system", "너는 대한민국 우주항공 산업을 세계적으로 발전시킬 최고의 정치인이야."),
        ("user", "{input}")
     ]
)


chain = prompt1 | llm                #pipe 연산자. 앞쪽에서 나온 결과를 뒤에 전달해준다는 의미

output1 = chain.invoke({"input":"2024년 우주항공산업 지원 정책에 대해 알려줘"})

내가 프롬프트를 써주면서 AI가 대답을 더 잘하도록 도와줄 수 있다. 저 system 옆에다가 쓰고싶은 프롬프트를 써주면 된다. prompt ! 저렇게 써주면 대답을 더 잘하는 것 같다.

 

 

 

 

 

 

 

#파싱하기 (답변내용을 텍스트만 뽑아낼 수 있음)


from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()


chain = prompt1 | llm | output_parser     #모듈을 또 연결한다. 위 프롬프트도 연결함.


output2 = chain.invoke({"input":"2024년 우주항공산업 지원 정책에 대해 알려줘"})       #text만 출력가능.
# print(output2)

이렇게 해서는 내가 얻고싶은 text만 얻을 수 있다. 

위에서 output1을 출력하면 답변 text만 나오는 게 아니라 잡다한 것이 섞여서 나온다. 

 

output1 결과

content='2024년 우주항공산업을 지원하기 위한 정책에는 다양한 측면이 포함될 수 있습니다. 몇 가지 중요한  
정책 아이디어를 소개해 드리겠습니다:\n\n1. **연구 및 개발 지원**: 새로운 우주 기술 및 혁신적인 아이디어 
를 개발하기 위한 연구를 지원하는 프로그램을 강화하고 장려해야 합니다. 연구기관, 대학, 기업 등 다양한 주 
체들이 참여할 수 있는 지원체계를 구축해야 합니다.\n\n2. **국제 협력 강화**: 세계 각국의 우주항공산업 기 
업들과의 협력을 강화하여 기술 교류, 공동 연구 및 프로젝트 참여를 촉진해야 합니다. 이를 통해 한국 우주항 
공 기술의 수준을 높일 수 있습니다.\n\n3. **투자 유치 및 세제 혜택 제공**: 우주항공 기업들을 유치하고 육 
성하기 위해 투자 유치를 촉진하고, 우주항공 산업에 투자하는 기업들에게는 세제 혜택을 제공하는 정책을 실시
해야 합니다.\n\n4. **인프라 구축**: 우주발사장 및 우주항공 연구시설 등의 인프라를 강화하고 확충하여 우주
항공산업의 성장을 지원해야 합니다.\n\n5. **인재 육성**: 우주항공산업에 필요한 전문 인력을 양성하기 위한 
교육 및 인재 육성 프로그램을 지원하고 강화해야 합니다.\n\n이러한 정책을 통해 2024년에는 대한민국의 우주 
항공산업이 세계적인 수준으로 발전할 수 있도록 노력할 것입니다.' response_metadata={'finish_reason': 'stop', 'logprobs': None}

 

output2 결과

2024년 우주항공 산업을 지원하기 위한 정책은 다양한 측면에서 발전을 이루어낼 것입니다. 몇 가지 예시로는  
다음과 같은 정책들이 고려될 수 있습니다:

1. 투자 촉진: 정부는 우주항공 기업들에 대한 투자를 촉진하기 위해 세제 혜택이나 보조금을 제공할 수 있습니
다. 또한, 연구 및 개발을 지원하는 프로그램을 확대하여 혁신적인 기술의 개발을 촉진할 것입니다.

2. 협력 강화: 국제 우주협력을 강화하여 우주항공 기술 및 지식을 교류하고 협력 프로젝트를 추진할 것입니다. 이를 통해 우주항공 기술의 발전을 촉진하고 우주 산업의 국제경쟁력을 높일 수 있습니다.

3. 인력 양성: 우주항공 산업을 지원하기 위해 전문가들을 양성하는 교육 프로그램을 강화할 것입니다. 또한,  
청소년들을 대상으로 한 우주항공 교육 프로그램을 확대하여 우주항공 분야에 대한 관심을 증진시킬 것입니다. 

4. 규제 혁신: 우주항공 산업을 적극 지원하기 위해 관련 규제를 혁신하고 업무환경을 개선할 것입니다. 이를  
통해 기업들이 더욱 쉽게 혁신적인 기술을 개발하고 시장에 성공적으로 진출할 수 있도록 지원할 것입니다.    

이러한 정책들을 통해 2024년에는 대한민국의 우주항공 산업이 세계적으로 높은 수준의 기술력과 경쟁력을 갖추
어 성장할 수 있도록 노력할 것입니다.

더 깔끔하게 나온다.

 

 

 

 

 

 

 

 

 

특정 웹사이트에 접속해서, 거기서 있는 자료를 알아서 참조해서 대답하라고 시키고 싶을 때가 있다.

 

 

#크롤링 접목해서 특정 웹사이트를 참조해서 대답 받기.
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://www.korea.kr/briefing/policyBriefingView.do?newsId=156610277")     #인스턴스 생성
docs = loader.load()

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(openai_api_key=api_key)

#임베딩 이라는 것은 사람이 이해하는 자연어나 이미지를 컴퓨터가 처리할 수 있는 숫자 형태의 벡터로 변환하는 기술.

from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
#FAISS는 Facebook AI Research에 의해 개발된 효율적인 유사성 검색-클러스터링의 대규모 데이터셋을 위한 라이브러리
#벡터간 유사성 검색에 초점, 빠른 검색속도와 높은 정확도를 제공함.
#이미지 또는 문서의 벡터 표현을 기반으로 유사한 항목을 빠르게 찾을 수 있음.

text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)

# print(vector)
from langchain.chains.combine_documents import create_stuff_documents_chain
# context = "너는 최고의 우주항공분야 전문가야. 그와 동시에 한국의 우주항공산업 발전을 위해 일하고 있어."
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:

<context>
{context}
</context>

Question: {input}""")

document_chain = create_stuff_documents_chain(llm, prompt)
# print(document_chain)

from langchain.chains import create_retrieval_chain

retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)

response = retrieval_chain.invoke({"input": "우주항공청은 왜 필요해 ?"})
print(response["answer"])

긴 과정을 거쳐 한 웹사이트에서 가져온 텍스트를 vector에 넣는다. 

 

그리고나서 retriever를 사용해서 response안의 answer를 받기까지 꽤 긴 과정을 거치면 

 

한 웹사이트에 있는 자료를 참조해서 답변을 해준다.