■ load_summarize_chain 함수에서 question_prompt/refine_prompt 인자를 사용하는 방법을 보여준다.
▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import os from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import CharacterTextSplitter from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate from langchain.chains.summarize import load_summarize_chain os.environ["OPENAI_API_KEY"] = "<OPENAI_API_KEY>" # 문서 리스트를 로드한다. webBaseLoader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/") documentList = webBaseLoader.load() # 분할 문서 리스트를 만든다. characterTextSplitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size = 1000, chunk_overlap = 0) splitDocumentList = characterTextSplitter.split_documents(documentList) # LLM 모델을 설정한다. chatOpenAI = ChatOpenAI(temperature = 0) # 요약 프롬프트 템플리트를 설정한다. summraryPromptTemplateString = """Write a concise summary of the following : {text} CONCISE SUMMARY :""" summaryPromptTemplate = PromptTemplate.from_template(summraryPromptTemplateString) # REFINE 프롬프트 템플리트를 설정한다. refinePromptTemplateString = ( "Your job is to produce a final summary\n" "We have provided an existing summary up to a certain point: {existing_answer}\n" "We have the opportunity to refine the existing summary" "(only if needed) with some more context below.\n" "------------\n" "{text}\n" "------------\n" "Given the new context, refine the original summary in Korean" "If the context isn't useful, return the original summary." ) refinePromptTemplate = PromptTemplate.from_template(refinePromptTemplateString) # REFINE 문서 체인을 설정한다. refineDocumentsChain = load_summarize_chain( llm = chatOpenAI, chain_type = "refine", question_prompt = summaryPromptTemplate, refine_prompt = refinePromptTemplate, return_intermediate_steps = False, input_key = "input_documents", output_key = "output_text" ) # REFINE 문서 체인을 실행한다. resultDictionary = refineDocumentsChain.invoke({"input_documents" : splitDocumentList}, return_only_outputs = True) print(resultDictionary["output_text"]) """ LLM Powered Autonomous Agents는 제한된 컨텍스트 용량으로 인해 역사적 정보, 상세한 지침, API 호출 컨텍스트 및 응답을 포함시키는 것이 제한되어 있습니다. 시스템의 설계는 이러한 제한된 통신 대역폭과 함께 작동해야 하며, 과거의 실수에서 배우는 자기 반성과 같은 메커니즘은 긴 또는 무한한 컨텍스트 창에서 큰 이점을 얻을 수 있습니다. 벡터 저장소와 검색은 더 큰 지식 풀에 액세스할 수 있지만, 그들의 표현력은 완전한 주의와 같이 강력하지 않습니다. 또한, LLM은 예기치 않은 오류에 직면했을 때 계획을 조정하는 것과 솔루션 공간을 효과적으로 탐색하는 것이 여전히 어려운 과제로 남아 있습니다. LLM은 시행착오로부터 배우는 인간들과 비교하여 덜 견고합니다. 현재 에이전트 시스템은 LLM과 기억 및 도구와 같은 외부 구성 요소 사이의 인터페이스로 자연어에 의존합니다. 그러나 모델 출력의 신뢰성은 의문스러울 수 있으며, LLM은 형식 오류를 일으키거나 때로는 반항적인 행동(예: 지시를 따르지 않음)을 보일 수 있습니다. 결과적으로, 에이전트 데모 코드의 많은 부분은 모델 출력을 구문 분석하는 데 초점을 맞추고 있습니다. 최근 연구 및 참고 자료를 통해 LLM을 향상시키는 다양한 방법과 기술이 제안되고 있으며, 이를 통해 LLM 기반 자율 에이전트의 성능과 신뢰성을 향상시킬 수 있을 것으로 기대됩니다. """ |
▶ requirements.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
aiohttp==3.9.5 aiosignal==1.3.1 annotated-types==0.7.0 anyio==4.4.0 async-timeout==4.0.3 attrs==23.2.0 beautifulsoup4==4.12.3 bs4==0.0.2 certifi==2024.6.2 charset-normalizer==3.3.2 dataclasses-json==0.6.7 distro==1.9.0 exceptiongroup==1.2.1 frozenlist==1.4.1 greenlet==3.0.3 h11==0.14.0 httpcore==1.0.5 httpx==0.27.0 idna==3.7 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.2.5 langchain-community==0.2.5 langchain-core==0.2.7 langchain-openai==0.1.8 langchain-text-splitters==0.2.1 langsmith==0.1.77 marshmallow==3.21.3 multidict==6.0.5 mypy-extensions==1.0.0 numpy==1.26.4 openai==1.34.0 orjson==3.10.5 packaging==24.1 pydantic==2.7.4 pydantic_core==2.18.4 PyYAML==6.0.1 regex==2024.5.15 requests==2.32.3 sniffio==1.3.1 soupsieve==2.5 SQLAlchemy==2.0.30 tenacity==8.3.0 tiktoken==0.7.0 tqdm==4.66.4 typing-inspect==0.9.0 typing_extensions==4.12.2 urllib3==2.2.1 yarl==1.9.4 |
※ pip install langchain langchain-community langchain-openai bs4 명령을 실행했다.