Search
🤖

dart api 기반 챗봇을 만들어 보자

결과물 제출 여부
발표 참불
참여
일정
회원
데이터 수집 DART → 데이터 저장 로컬 → embedding, vector db kb→ langchain → llm
from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.llms import OpenAI from langchain.chains import RetrievalQA
Python
복사
url_for_company = "https://opendart.fss.or.kr/api/list.json" # xml도 가능함. json이 편해서 이걸로 봤음. params = { "crtfc_key": dart_api_key, "corp_code": "00126380", "bgn_de": "20240101", "end_de": "20250630", "pblntf_detail_ty": "A001" # 사업보고서 조회 시 이 파라미터를 반드시 붙여줘야 함. } res = requests.get(url, params=params).json() print(json.dumps(res, indent=2, ensure_ascii=False)) """ { "status": "000", "message": "정상", "page_no": 1, "page_count": 10, "total_count": 2, "total_page": 1, "list": [ { "corp_code": "00126380", "corp_name": "삼성전자", "stock_code": "005930", "corp_cls": "Y", "report_nm": "사업보고서 (2024.12)", "rcept_no": "20250311001085", # 여기에서 나온 문서번호를 rcept_no에 입력해야 함. "flr_nm": "삼성전자", "rcept_dt": "20250311", "rm": "연" }, { """ ############ rcept_no = "20250311001085" # 문서 번호 별도 조회 # url_for_company에서 company code를 기반으로 검색해야함. 그러면 회사와 문서 이름 문서 번호가 나옴 url = "https://opendart.fss.or.kr/api/document.xml" params = { "crtfc_key": dart_api_key, "rcept_no": rcept_no } response = requests.get(url, params=params) # soup = BeautifulSoup(response.content, "html.parser", from_encoding="utf-8") # Content Type이 대체로 xml, msdownload 일 경우 압축 해제 처리를 해줘야 함 if "xml" in response.headers.get("Content-Type", "").lower(): soup = BeautifulSoup(response.content, "xml") text = soup.get_text("\n", strip=True) elif "msdownload" in response.headers.get("Content-Type", "").lower() or \ "zip" in response.headers.get("Content-Type", "").lower(): with zipfile.ZipFile(io.BytesIO(response.content)) as z: print("ZIP 내부 파일:", z.namelist()) xml_name = z.namelist()[0] xml_data = z.read(xml_name) soup = BeautifulSoup(xml_data, "xml") text = soup.get_text("\n", strip=True) else: text = None print(text[:1000]) """ """ encoding = tiktoken.encoding_for_model("gpt-4o") tokens = encoding.encode(text) print(tokens) # 56517 # 190원
Python
복사
samsung.txt
ext_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 한 덩어리당 토큰 수 chunk_overlap=100, # 겹치는 부분 length_function=len, separators=["\n\n", "\n", " ", ""] ) split_docs = text_splitter.split_documents(docs) embeddings = OpenAIEmbeddings() vectorstore = Chroma.from_documents(split_docs, embeddings) llm = OpenAI(temperature=0.7) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), return_source_documents=True )
Python
복사
test_questions = [ "삼성전자의 최근 재무상황은 어떤가요?", "회사의 주요 사업 내용을 요약해주세요", "최근 공시에서 주목할 만한 내용이 있나요?" ] for question in test_questions: result = qa_chain({"query": question}) print(f"\n질문: {question}") print(f"답변: {result['result']}\n")
Python
복사
my_question = input("여기에 질문을 입력하세요:") result = qa_chain({"query": my_question}) print(result['result'])
Python
복사