logo
Loading...

正課第四節(1) - 進階拆解和應用這些Langchain 組建(一步一步熟悉直到可以應用) - RAG技術: 智能助手開發實戰 - Cupoy

正課的第四節,我們會拆很多堂課來讓大家慢慢熟悉Langchain甚至可以配合其他強大的工具如ollama等等平台,讓大家值回票價。 話不多說 直接上code: (基礎模組的再練習)進入4-1 重點1....

正課的第四節,我們會拆很多堂課來讓大家慢慢熟悉Langchain甚至可以配合其他強大的工具如ollama等等平台,讓大家值回票價。 話不多說 直接上code: (基礎模組的再練習)進入4-1 重點1.要很熟悉使用langchain的三大模組: 1.prompt template  2.models chain  3.output parsers 重點 2.Langsmith 要熟悉 重點3.啟動你的服務 :LangServe code for learn: Note : 要很習慣一開始就透過 load_dotenv()載入必要api key import os from dotenv import load_dotenv load_dotenv() os.environ['OPENAI_API_KEY']=os.getenv("OPENAI_API_KEY") ## Langsmith Tracking os.environ["LANGCHAIN_API_KEY"]=os.getenv("LANGCHAIN_API_KEY") os.environ["LANGCHAIN_TRACING_V2"]="true" os.environ["LANGCHAIN_PROJECT"]=os.getenv("LANGCHAIN_PROJECT") #一樣先用 from langchain_openai import ChatOpenAI llm=ChatOpenAI(model="gpt-4o") print(llm) Note: 還記得invoke嗎? ## Input and get response form LLM result=llm.invoke("What is generative AI?") print(result) 聊天的提示模板建立: 角色扮演 ### Chatprompt Template 設計 from langchain_core.prompts import ChatPromptTemplate prompt=ChatPromptTemplate.from_messages( [ ("system","You are an expert AI Engineer. Provide me answers based on the questions"), ("user","{input}") ] ) prompt type(response) 輸出解析器建立: ## stroutput Parser from langchain_core.output_parsers import StrOutputParser output_parser=StrOutputParser() chain=prompt|llm|output_parser response=chain.invoke({"input":"Can you tell me about Langsmith?"}) print(response) 4-2 GenAI搭配Langchain的簡單應用 import os from dotenv import load_dotenv load_dotenv() os.environ['OPENAI_API_KEY']=os.getenv("OPENAI_API_KEY") ## Langsmith Tracking os.environ["LANGCHAIN_API_KEY"]=os.getenv("LANGCHAIN_API_KEY") os.environ["LANGCHAIN_TRACING_V2"]="true" os.environ["LANGCHAIN_PROJECT"]=os.getenv("LANGCHAIN_PROJECT") ## Data Ingestion--From the website we need to scrape the data from langchain_community.document_loaders import WebBaseLoader Note:其實有非常非常多的loader工具可以用,我們這邊拿一個網頁的載入器來當案例 上課會直接進入網站中overview: https://python.langchain.com/v0.1/docs/modules/data_connection/document_loaders/ 接下來我們就來爬看看大家可能相對不叫不熟的langsmith的文件! loader=WebBaseLoader("https://docs.smith.langchain.com/tutorials/Administrators/manage_spend") loader 檢查一下目前被包進去變成langchain的資料結構長啥樣: docs=loader.load() docs #切割囉! ### Load Data--> Docs-->Divide our Docuemnts into chunks dcouments-->text-->vectors-->Vector Embeddings--->Vector Store DB@ ### Load Data--> Docs-->Divide our Docuemnts into chunks dcouments-->text-->vectors-->Vector Embeddings--->Vector Store DB ### Load Data--> Docs-->Divide our Docuemnts into chunks dcouments-->text-->vectors-->Vector Embeddings--->Vector Store DB from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200) documents=text_splitter.split_documents(docs) documents 來個向量化! from langchain_openai import OpenAIEmbeddings embeddings=OpenAIEmbeddings() 要記得存入向量資料庫!! from langchain_community.vectorstores import FAISS vectorstoredb=FAISS.from_documents(documents,embeddings) 檢查下有沒有存成功 vectorstoredb 問問題吧 ## Query From a vector db query="LangSmith has two usage limits: total traces and extended" result=vectorstoredb.similarity_search(query) result[0].page_content 來,再開一開實作應用,建立document chain: from langchain_openai import ChatOpenAI llm=ChatOpenAI(model="gpt-4o") ## Retrieval Chain, Document chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate prompt=ChatPromptTemplate.from_template( """ Answer the following question based only on the provided context: ###draft_code_symbol_lessthen###context> {context} ###draft_code_symbol_lessthen###/context> """ ) document_chain=create_stuff_documents_chain(llm,prompt) document_chain from langchain_core.documents import Document document_chain.invoke({ "input":"LangSmith has two usage limits: total traces and extended", "context":[Document(page_content="LangSmith has two usage limits: total traces and extended traces. These correspond to the two metrics we've been tracking on our usage graph. ")] }) 我們希望文件首先來自我們剛剛設置的檢索器。這樣,我們就可以使用檢索器動態選擇最相關的文件,並將它們傳遞到特定問題中。我們現在已經設置了一個檢索器(retriever),這是一個工具或系統,能夠從一個大的文件庫中找到與查詢問題最相關的資料。首先,這些文件會由檢索器篩選出來,而不是直接從全部文件中隨機選擇。然後,我們會將檢索器選出的文件傳遞給進一步的處理程序,以解答具體的問題。這樣可以確保提供的答案是基於最相關的文件,從而提升解答的精準度和相關性。 ### Input--->Retriever--->vectorstoredb vectorstoredb 從向量料庫來建立檢索器應該相當直觀吧? retriever=vectorstoredb.as_retriever() from langchain.chains import create_retrieval_chain retrieval_chain=create_retrieval_chain(retriever,document_chain) retrieval_chain ## Get the response form the LLM response=retrieval_chain.invoke({"input":"LangSmith has two usage limits: total traces and extended"}) response['answer'] response response['context'] 這樣,輸入,參考到的上下文,還有回應就都有了。 進階思考:只要再搜集一個 人為設定的groundTruth是不是就可以跑完整的RAG Evaluation了? 我們回想一下前面有提到一下子的評估工具“RAGAS"是不是要湊滿這些條件,就進去csv檔裡面就可以跑完整的評估?各位回想一下吧~~