# RAG with Gemini

## LangChain RAG: Google Gemini API

{% embed url="<https://gemini.google.com/app>" %}

```python
from IPython.display import Markdown
import os
from dotenv import load_dotenv  

load_dotenv()
api_key = os.getenv("GOOGLE_API_KE")
```

```python
%pip install -U --quiet langchain-google-genai
```

```python
%pip install -U --quiet langchain tiktoken pypdf sentence_transformers chromadb
```

```python
from langchain_google_genai import ChatGoogleGenerativeAI
```

```python
llm = ChatGoogleGenerativeAI(model="gemini-pro")
result = llm.invoke("네이버에 대해 보고서를 작성해줘")
Markdown(result.content)
```

```python
# from langchain.chains import RetrievalQA
# from langchain.chat_models import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import PyPDFLoader
```

```python
loader = PyPDFLoader("/content/drive/MyDrive/강의 자료/[이슈리포트 2022-2호] 혁신성장 정책금융 동향.pdf")
pages = loader.load_and_split()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(pages)

from langchain.embeddings import HuggingFaceEmbeddings

model_name = "jhgan/ko-sbert-nli"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
hf = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

docsearch = Chroma.from_documents(texts, hf)
```

```python
 retriever = docsearch.as_retriever(
                                    search_type="mmr",
                                    search_kwargs={'k':3, 'fetch_k': 10})
 retriever.get_relevant_documents("혁신성장 정책금융에 대해서 설명해줘")
```

```
[Document(page_content='혁신성장 정책금융 동향 : ICT 산업을 중심으로\n  CIS이슈리포트 2022-2 호 | 3 |1. 들어가며\n▶혁신성장 정책금융기관은 건강한 혁신산업 생태계를 조성하기 위해 기업 성장에 필요한 자금을 \n지원하는 혁신성장 정책금융 제도를 시행하고 있음\n￮혁신성장 정책금융기관은 혁신성장에 대한 정의를 구체화한 정책금융 가이드라인*에 따라 혁신성장  \n산업육성을 위한 정책금융 업무를 추진 중임\n       * 혁신성장 기업발굴 및 금융지원을 위해 활용하는 기준으로 , ‘9대 테마-46개 분야-296개 품목’으로 구성\n▶혁신성장 정책금융 제도 시행 이후 공급 규모가 매년 증가하는 등, 미래 혁신성장 분야의 글로벌 \n경쟁력 확보를 위한 금융지원이 지속 추진 중임\n￮정책금융기관의 혁신성장 분야 정책금융 공급규모는 2017년 240,787 억 원에서  연평균  37.2% 증가\n하여 2021 년 854,338 억 원에 이르는 등 그 외연을 확장해나가고 있음', metadata={'page': 2, 'source': '/content/drive/MyDrive/강의 자료/[이슈리포트 2022-2호] 혁신성장 정책금융 동향.pdf'}),
 Document(page_content='￮또한, 미래 성장성은 유망하나 단기 수익 창출이 어려운 산업의 지원 강화를 위해 정책금융 뿐만 아니라  \n민관주도의 역동적 금융으로 혁신성장 금융지원 영역을 확대할 필요가 있음', metadata={'page': 1, 'source': '/content/drive/MyDrive/강의 자료/[이슈리포트 2022-2호] 혁신성장 정책금융 동향.pdf'}),
 Document(page_content='동 품목으로의 정책금융 공급은 지속 증가할 것으로 전망됨\n▶센서측정 테마의 경우 정보통신 , 전기전자 테마 대비 정책금융 공급 규모는 작은 편이나 , 객체탐지 분야\n로의 정책금융 공급이 꾸준한 것을 확인함\n￮스마트팜 , 자율주행차 등 스마트센서를 필요로 하는 산업으로부터의 수요가 증가함에 따라 동 품목 \n시장의 성장이 전망되며 , 이에 정책금융 공급 또한 지속 증가할 것임\n▶원천기술 경쟁력 강화 등에 혁신성장 정책금융이 중요한 역할을 하고 있으며 , 미래먹거리 산업 육성을 위해 \n역동적인 혁신금융으로서의 변화가 기대됨\n￮혁신 ICT 산업은 관련 시장이 지속적으로 성장할 것으로 전망되나 , 원천기술 미확보 및 높은 \n해외 의존도가 약점으로 지적되어 국내 기업의 경쟁력 강화가 필요함\n￮이에 혁신기업을 발굴하는 가이드라인의 지속적인 최신화 ·내실화에 노력을 기하는 한편, 정책금융\n기관 뿐만 아니라 전 금융권으로 혁신기업에 대한 금융지원을 확대할 필요가 있음', metadata={'page': 17, 'source': '/content/drive/MyDrive/강의 자료/[이슈리포트 2022-2호] 혁신성장 정책금융 동향.pdf'})]
```

```python
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnableMap

template = """Answer the question as based only on the following context:
{context}

Question: {question}
"""

prompt = ChatPromptTemplate.from_template(template)
```

```python
gemini = ChatGoogleGenerativeAI(model="gemini-pro", temperature = 0)

chain = RunnableMap({
    "context": lambda x: retriever.get_relevant_documents(x['question']),
    "question": lambda x: x['question']
}) | prompt | gemini
```

```python
Markdown(chain.invoke({'question': "혁신성장 정책금융에 대해서 설명해줘"}).content)
```

혁신성장 정책금융은 건강한 혁신산업 생태계를 조성하기 위해 기업 성장에 필요한 자금을 지원하는 혁신성장 정책금융 제도입니다. 혁신성장 정책금융기관은 혁신성장에 대한 정의를 구체화한 정책금융 가이드라인에 따라 혁신성장 산업육성을 위한 정책금융 업무를 추진하고 있습니다. 혁신성장 정책금융 제도 시행 이후 공급 규모가 매년 증가하는 등, 미래 혁신성장 분야의 글로벌 경쟁력 확보를 위한 금융지원이 지속 추진 중입니다.
