Google Gemini With LangChain RAG

2023-12-22 15:48:53

初始化模型

import os
os.environ["GOOGLE_API_KEY"] = 'XXX'#填入自己的api_key

from IPython.display import display
from IPython.display import Markdown
import google.generativeai as genai

from langchain_google_genai import ChatGoogleGenerativeAI,GoogleGenerativeAIEmbeddings
from langchain.vectorstores import DocArrayInMemorySearch
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser

model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.7)


我们创建一个简单的向量数据库,并存储几条文本

embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
 
vectorstore = DocArrayInMemorySearch.from_texts(
    ["Gemini Pro 是 外星人 开发的大型语言模型。",
     "Gemini 可以是一个星座,也可以是一系列语言模型的名称。",
     "人是由龙进化而来的。",
     "天才儿童喜欢吃牛肉",
      "儿童喜欢吃零食"],
 
    embedding=embeddings # passing in the embedder model
)
 
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

这里我们创建了一个内存向量数据库,并向其中存储了5条文本,然后使用了gemini的嵌入模型“embedding-001”作为文本嵌入工具,最后我们通过向量数据库创建了一个检索器retriver, 接下来我们可以通过检索器retriver来检索向量数据库中的相关文档:

接下来我们来创建chian, 不过在创建chian之前我们需要创建prompt模板和RunnableMap,最后将它们组合成一个chain:

from langchain.schema.runnable import RunnableMap
 
#创建prompt模板
template = """Answer the question a a full sentence, based only on the following context:
{context}
Question: {question}
"""
 
output_parser = StrOutputParser()
#由模板生成prompt
prompt = ChatPromptTemplate.from_template(template)
 
#创建chain
chain = RunnableMap({
    "context": lambda x: retriever.get_relevant_documents(x["question"]),
    "question": lambda x: x["question"]
}) | prompt | model | output_parser


本实验使用llama.cpp的README.md作为我们需要进行询问的文档。

from langchain.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader("./README.md")
text = loader.load()


from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 2000,
    chunk_overlap  = 400,
    length_function = len,
    is_separator_regex = False
)
all_splits = text_splitter.split_documents(text)

from langchain.vectorstores import FAISS
vectorstore = FAISS.from_documents(all_splits, embeddings) 
from langchain.schema.runnable import RunnableMap
from langchain_core.runnables import RunnablePassthrough
 
#创建prompt模板
template = """Answer the question a a full sentence, based only on the following context:
{context}
Question: {question}
"""

#由模板生成prompt
prompt = ChatPromptTemplate.from_template(template)
 
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

query = {"question": "What is --interactive option used for?"}

#创建chain
chain = RunnableMap({
    "context": lambda x: retriever.get_relevant_documents(x["question"]),
    "question": RunnablePassthrough()
}) | prompt | model | output_parser

chain.invoke(query)

文章来源:https://blog.csdn.net/zwqjoy/article/details/135068927
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。