랭최인은 무엇인가 ??
이것은 오픈 소스 프로젝트로서, 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를 받기까지 꽤 긴 과정을 거치면
한 웹사이트에 있는 자료를 참조해서 답변을 해준다.