目錄
一、前言
二、前置準備
2.1 安裝 Langchain必須的依賴
2.1.1 python環境
2.1.2 langchain openai 環境
2.1.3 準備一個apikey
2.1.4 langchain 核心組件
三、Langchain 各組件使用
3.1?Chat models組件
3.1.1 Invocation 使用
3.1.1.1 結果解析
3.2 提示詞模板
3.2.1 什么是提示詞模板
3.2.2 創建提示詞模板
3.2.2.1 PromptTemplate 簡單提示詞模板
3.2.2.2 ChatPromptTemplate 聊天提示詞模板
3.2.2.3 MessagePlaceholer 聊天提示詞模板
3.2.2.4 少樣本提示詞模板
3.2.2.5 示例選擇器
3.3 memory組件
3.3.1 ChatMessageHistory 案例代碼
3.3.2 流式輸出案例代碼
3.4 向量數據庫與文檔檢索
3.4.1 安裝向量數據庫
3.4.2 代碼操作示例
3.4.3 組合大模型組件使用
四、寫在文末
一、前言
OpenAI作為人工智能領域的先鋒,其提供的API為開發者打開了構建智能應用的大門。而作為LLM領域的佼佼者Langchain,隨著RAG在眾多的領域進行落地實踐,Langchanin的熱度也越來越高,然而,想要在實際項目中有效利用Langchanin提供的各種能力,了解如何使用Langchain進行集成是非常重要的。本文將詳細介紹如何使用OpenAI集成Langchain,并使用Langchain的各種核心組件能力。
二、前置準備
在正式開始使用Langchain之前,你需要在本地準備基礎的開發和運行環境,比如python環境、Langchain組件等,參考下面的操作步驟即可。
2.1 安裝 Langchain必須的依賴
2.1.1 python環境
建議版本 3.10
2.1.2 langchain openai 環境
使用下面的命令進行安裝
pip install langchain openai
2.1.3 準備一個apikey
后面程序中調用API時候需要用到
2.1.4 langchain 核心組件
langchain 官網地址如下:ChatOpenAI | 🦜?🔗 LangChain
可以基于此文檔查看langchain提供的各個組件以及API
三、Langchain 各組件使用
接下來將通過實際案例展示Langchain 各組件的詳細使用
3.1?Chat models組件
文檔地址:Chat models | 🦜?🔗 LangChain,官方展示了可以對接LangChain的多種大模型,這里選擇ChatOpenAi;
執行下面命令安裝依賴組件
pip install -qU langchain-openai
3.1.1 Invocation 使用
參考官方提供案例
然后編寫自己的代碼,如下:
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate#langchain的openai的sdk
from langchain_openai import ChatOpenAIllm = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)messages = [("system","You are a helpful assistant that translates English to Chinese. Translate the user sentence.",),("human", "I love programming."),
]
ai_msg = llm.invoke(messages)
print(ai_msg)
運行上面的代碼,可以看到目標的英文被翻譯成了中文
或者使用下面的這種寫法也是可以的
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage#langchain的openai的sdk
from langchain_openai import ChatOpenAI#llm=ChatOpenAI()model = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)msg=[SystemMessage(content="請將下面的內容翻譯成英語."), HumanMessage(content="你好,請問你要去哪里")
]res = model.invoke(msg)
print(res)
3.1.1.1 結果解析
如果上面的輸出結果看起來不夠直觀,langchain的包里面還提供了內容解析的工具,只需要導入StrOutputParser包即可
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate#langchain的openai的sdk
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser#llm=ChatOpenAI()llm = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)prompt=ChatPromptTemplate.from_messages([("system","您是世界級的技術專家."),("user","{input}"),
])#通過langcian的鏈式調用,生成一個提示詞的chain
chain=prompt | llmresult=chain.invoke({"input":"幫我寫一篇AI的技術文章,100字以內"})print(result)parser = StrOutputParser()
parser_str = parser.invoke(result)
print(parser_str)
再次運行上面的程序,此時得到的就是純粹的內容了
3.2 提示詞模板
3.2.1 什么是提示詞模板
語言模型以文本作為輸入,這個文本通常被稱為提示詞,在開發過程中,對于提示詞來說不能直接硬編碼,這樣不利于提示詞管理,而是通過提示詞模板進行維護,類似于開發過程中遇到的短信模板,郵件模板等。
提示詞模板是一種特殊的文本,它 可以為特定任務提供額外的上下文信息。 在LLM 應 用中,用戶輸入通常不直接被傳遞給模型本身, 而是被添加到一個更大的文本,即提示詞模板中。提示詞模板為當前的具體任務提供了額外的上下文信息,這能夠更好地引導模型生成預期的輸出。
一個提示詞模板通常包含如下內容:
-
發給大語言模型(LLM)指令;
-
一組問答示例,以告訴AI以什么格式返回請求;
-
發給大語言模型的問題;
3.2.2 創建提示詞模板
在LangChain中,最簡單的,可以使用PromptTemplate類創建簡單的提示詞模板。在提示詞模板可以內嵌任意數量的模板參數,然后通過參數值格式化模板內容。
也可以使用MessagePromptTemplate來創建提示詞模板。可以用一個或多MessagePromptTemplate創建一個ChatPromptTemplate
如下示例
from langchain.prompts.chat import(ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
)template =
("You are a helpful assistant that translates [input_languagel to""(output_language}."
)system_message_prompt=SystemMessagePromptTemplate.from_template(template)human_template ="(text}"human_message_promptHumanMessagePromptTemplate.from_template(human_template)chat_prompt =ChatPromptTemplate.from_messages([system_message_prompt,human_message_promptchat_prompt.format_messages(input_language="English",output_language="French",text="I love programming."
上述代碼首先定義了兩個模板:
-
一個是系統消息模板,描述了任務的上下文(翻譯助手的角色和翻譯任務);
-
另一個是人類消息模板,其中的內容是用戶的輸入。然后,使用ChatPromptTemplate的from_messages方法將這兩個模板結合起來,生成一個聊天提示詞模板。
-
當想要檢查發送給模型的提示詞是否確實與預期的提示詞相符時,可以調用ChatPromptTemplate的format_messages方法,查看該提示詞模板的最終呈現
msg=[SystemMessage(content="請將下面的內容翻譯成英語."), HumanMessage(content="你好,請問你要去哪里")
]
通過這種方式,不僅可以讓聊天模型包裝器生成預期的輸出,對開發者來說,也不用擔心是否符合提示詞消息列表的數據格式,只需要提供具體的任務描述即可。
3.2.2.1 PromptTemplate 簡單提示詞模板
這是最簡單的一種提示詞模板,調用PromptTemplate的from_template方法,在模板內容中預留占位符作為后續的輸入參數即可
#langchain聊天的提示詞模板
from langchain_core.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("給我講一個關于{topic}的歷史故事")result = prompt_template.format(topic="足球")print(result)
運行一下,可以看到下面的效果,可以看到調用format方法的時候,最終“足球”就作為入參帶入到模板中輸出了
3.2.2.2 ChatPromptTemplate 聊天提示詞模板
如下是一段基本的提示詞模板代碼案例,設置了兩個模板參數,調用的時候動態傳入
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate#數組的每一個元素代表一個消息,每個消息元組,第一個參數代表消息角色,第二個參數代表消息內容
#消息角色:system代表系統消息,human代表人類消息,ai代表LLM返回的消息內容
#消息定義了2個模板參數name和user_input
chat_template = ChatPromptTemplate.from_messages([("system","你是一個人工智能助手,你的名字是{name}"),("human","你好"),("ai","我很好"),("human","{user_input}")]
)#通過模板參數格式化模板內容
result = chat_template.format_messages(name="小明",user_input="你叫什么名")
print(result)
運行一下看到如下的效果輸出
補充:
-
ChatPromptTemplate 用于聊天對話的場景中;
-
后續接入大模型之后,就可以將參數拼接模板一起傳給大模型,大模型就可以返回預期的結果了
ChatPromptTemplate 即聊天模型(Chat Model)提示詞模板,聊天模型以聊天消息列表作為輸入,這個聊天消息列表的消息內容也可以通過提示詞模板進行管理,這些聊天消息與原始的字符串不同,因為每個消息都與“角色(Role)”相關聯。
例如在OpenAI的Chat Completion API中,OpenAI的聊天模型,給不同聊天消息定義了三種角色類型,分別是:助手(Assistant),人類(Human),或系統(System)角色:
-
助手(Assistant)消息指的是當前消息是AI回答的內容;
-
人類(Human)消息值得是你發給AI的內容;
-
系統(System)消息通常是用來給AI身份進行描述;
示例代碼
參考下面的案例代碼,結合代碼中的注釋進行理解,在提示詞模板中,我們傳入了兩個變量,后續在調用的時候,只需要給這兩個變量賦值即可
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser#langchain的openai的sdk
from langchain_openai import ChatOpenAImodel = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)#定義模板
prompt_template=ChatPromptTemplate.from_messages([("system","您是世界級的翻譯專家,使用{language}語言翻譯如下內容"),("user","{input}"),
])#內容輸出解析器
output_parser=StrOutputParser()#得到一個鏈
chain = prompt_template | model | output_parser#輸出結果
result = chain.invoke({'language':'中文','input':'hello world'})
print(result)
或者使用下面的這種寫法
-
SystemMessage,對應著上面一種寫法中的 'system',由langchain自身API提供
-
HumanMessage,對應著上面一種寫法中的 'user',由langchain自身API提供
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage#langchain的openai的sdk
from langchain_openai import ChatOpenAI#llm=ChatOpenAI()model = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)msg=[SystemMessage(content="請將下面的內容翻譯成英語."), HumanMessage(content="你好,請問你要去哪里")
]res = model.invoke(msg)
print(res)
3.2.2.3 MessagePlaceholer 聊天提示詞模板
這個提示詞模板負責在特定的位置添加消息列表,在上面的ChatPromptTemplate中,我們看到了如何格式化兩條消息,每條消息都是一個字符串。但是如果我們希望用戶傳入一個消息列表,并將其插入到特定的位置該怎么辦呢?這就需要使用到MessagePlaceholer 的方式。如下示例代碼:
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderfrom langchain_core.messages import SystemMessage, HumanMessageprompt_template = ChatPromptTemplate.from_messages([('system', 'You are a helpful assistant '),#這里可以傳入一組消息MessagesPlaceholder('msgs')
])result = prompt_template.invoke({"msgs":[HumanMessage(content="你好")]})
print(result)
通過上面的運行結果不難看出,結果生成了2條消息,第一條是系統消息,第二條是我們傳入的HumanMessage,如果我們傳入了5條消息,那么一共會生成6條消息(系統消息加上傳入的5條),這對于將一系列消息插入到特定的位置非常有用。
還有一種實現相同效果的的替代方法是,不直接使用MessagesPlaceholder,而是下面這種:
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderfrom langchain_core.messages import SystemMessage, HumanMessageprompt_template = ChatPromptTemplate.from_messages([('system', 'You are a helpful assistant '),#這里可以傳入一組消息# MessagesPlaceholder('msgs')('placeholder','{msgs}')
])result = prompt_template.invoke({"msgs":[HumanMessage(content="你好")]})
print(result)
效果是一樣的
3.2.2.4 少樣本提示詞模板
即Few-shot prompt template , 這種提示詞模板中包含了少量的樣本信息,這樣做的目的是為了幫助模型更好的理解用戶的意圖,從而更好的回答問題或執行任務,少樣本提示詞模板是指使用一組少量的示例來指導模型處理新的輸入。使用這些提示詞可以用來訓練模型,以便模型可以更好的理解或回答類似的問題。
Q:鋼鐵俠是誰?
A:鋼鐵俠是漫威中的一個英雄人物。Q:什么是AI大模型?
A:...
告訴模型,Q是問題,A是答案,按照這種格式進行交互問答。后續大模型在回答問題的時候,就會參考你提供給它的示例,一定程度上可以避免大模型回答時產生的幻覺問題。
#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate,PromptTemplate
from langchain_core.prompts.few_shot import FewShotPromptTemplatefrom langchain_core.messages import SystemMessage, HumanMessageexamples = [{"question":"什么是人工智能?","answer":"人工智能(Artificial Intelligence)是指通過計算機模擬、擴展或擴展人的智能來構建智能系統的技術。"},{"question":"鋼鐵俠在漫威電影中一共出現了幾次變身","answer":"鋼鐵俠在漫威電影中一共出現了3次變身,分別是鋼鐵俠、浩克和美隊。"},{"question":"詹姆斯一共打了多少賽季的籃球了?","answer":"詹姆斯一共打了5個賽季的籃球,包括2003-2004賽季,2004-2005賽季,2005-2006賽季,2006-2007賽季,2007-2008賽季。"}
]example_prompt = PromptTemplate(input_variables=["question","answer"],template="問題:{question}\n答案:{answer}"
)#接收examples示例數組參數,通過example_prompt提示詞模板批量渲染示例內容
#suffix和input_variables參數用于在提示詞模板最后追加內容,input_variables用于定義suffix中包含的模板參數
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="問題:{input}",input_variables=["input"]
)print(prompt.format(input="詹姆斯在哪些賽季中出現過?"))
如下是一個使用openai調用的少樣本案例代碼
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_openai import ChatOpenAI
import os# 設置OpenAI API密鑰# 創建示例格式化器
example_prompt = PromptTemplate.from_template("Question: {question}\n{answer}")# 準備示例集
examples = [{"question": "1+1等于幾?", "answer": "答案是2"},{"question": "地球是什么形狀?", "answer": "地球近似于一個球體"},
]# 創建Few-Shot提示模板
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="Question: {input}",input_variables=["input"],
)# 創建OpenAI模型實例
llm = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)# 生成提示并獲取回答
user_question = "太陽系中最大的行星是哪個?"
full_prompt = prompt.invoke({"input": user_question}).to_string()
response = llm.invoke(full_prompt)print(f"問題: {user_question}")
print(f"回答: {response}")
運行一下可以看到下面的結果
3.2.2.5 示例選擇器
LangChain提供示例選擇器來提高效率,避免一次性發送所有示例給模型,同時減少使用的Token數量。如果有大量示例,可能需要選擇要包含在提示中的示例,示例選擇器是負責執行此操作的類。
LangChain有幾種不同類型的示例選擇器
名稱 | 描述 |
SemanticSimilarityExampleSelector | 使用輸入和示例之間的語義相似性來決定選擇哪些示例。 |
MaxMarginalRelevanceExampleSelector | 使用輸入和示例之間的最大邊際相關性來決定選擇哪些示例。 |
LengthBasedExampleSelector | 根據一定長度內可以容納的數量來選擇示例 |
NGramOverlapExampleSelector | 使用輸入和示例之間的 ngram 重疊來決定選擇哪些示例。 |
在下面的案例中,我們使用SemanticSimilarityExampleSelector類,該類根據輸入的相似性選擇小樣本示例,它使用嵌入模型計算輸入和小樣本之間的相似性,然后使用向量數據庫執行相似性搜索,獲取輸入相似的示例。
-
這里涉及向量計算、向量數據庫,在AI領域這兩個主要用于數據庫相似度搜索,例如,查詢相似文章內容,相似圖片、視頻等
先安裝下面的向量數據庫
pip install chromadb
完整的代碼如下
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddingsexamples = [{"question":"什么是人工智能?","answer":"人工智能(Artificial Intelligence)是指通過計算機模擬、擴展或擴展人的智能來構建智能系統的技術。"},{"question":"鋼鐵俠在漫威電影中一共出現了幾次變身","answer":"鋼鐵俠在漫威電影中一共出現了3次變身,分別是鋼鐵俠、浩克和美隊。"},{"question":"詹姆斯一共打了多少賽季的籃球了?","answer":"詹姆斯一共打了5個賽季的籃球,包括2003-2004賽季,2004-2005賽季,2005-2006賽季,2006-2007賽季,2007-2008賽季。"}
]# 初始化示例選擇器
example_selector = SemanticSimilarityExampleSelector.from_examples(#提供可選擇的示例列表examples,#用于生成嵌入的嵌入類,該嵌入用于衡量語義的相似性OpenAIEmbeddings(api_key='sk-...'),#用于存儲嵌入和執行相似度搜索的VectorStore類Chroma,#用于生成的示例數k=1
)question = "詹姆斯在哪些賽季打過籃球?"result_examples = example_selector.select_examples({"question":question})for example in result_examples:print("\\n")for key, value in example.items():print(f"{key}: {value}")
運行一下上述代碼,在輸出的結果中可以看到參考了我們給定的示例樣本,選擇了最接近的問題的答案
3.3 memory組件
在多輪對話中,為了使大模型能夠記住上下文對話,可以考慮使用這個memory組件,提前安裝依賴包
pip install langchain_community
該模塊中提供了ChatHistory,它允許聊天機器人記住過去的互動,并在后續的回答問題時考慮它們;
3.3.1 ChatMessageHistory 案例代碼
參考如下代碼
from langchain_community.chat_message_histories import ChatMessageHistory#langchain聊天的提示詞模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.runnables import RunnableWithMessageHistory#langchain的openai的sdk
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser#創建模型
model = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk-...'
)msg=[SystemMessage(content="請將下面的內容翻譯成英語."), HumanMessage(content="你好,請問你要去哪里")
]parser=StrOutputParser()#定義提示詞模板
prompt_template = ChatPromptTemplate = ChatPromptTemplate.from_messages([('system','你是一個樂于助人的助手,請用{language}盡你所能回答所有問題'),MessagesPlaceholder(variable_name="my_msg")])chain = prompt_template | model#保存聊天的歷史記錄
store={}#定義一個獲取session_id的函數,返回一共消息的歷史對象
def get_history(session_id: str):if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]do_msg = RunnableWithMessageHistory(chain,get_history,input_messages_key='my_msg' #每次聊天發送消息的key
)#給當前會話添加一個session
config={'configurable':{'session_id':'xm113'}}#第一輪對話
result_1 = do_msg.invoke({"my_msg": [HumanMessage(content="你好,我是小明")],"language": "中文"},config=config
)print(result_1.content)#第二輪對話
result_2 = do_msg.invoke({"my_msg": [HumanMessage(content="請問我的名字是什么")],"language": "中文"},config=config
)
print(result_2.content)
運行上面的代碼,通過控制臺的輸出結果不難看出,大模型在回答我們的第二個問題的時候,由于使用了ChatMessageHistory,在第一次的對話中,記住了第一輪對話的內容,所以第二輪對話中可以正確的輸出答案
3.3.2 流式輸出案例代碼
流式輸出是一種允許數據在生成的同時逐步傳輸的技術,而無需等待整個過程完成
流式輸出技術使得數據可以實時地、逐步地傳輸,而不是等待所有數據生成完畢后再一次性傳輸。這種技術特別適用于處理大型語言模型(LLM)和聊天模型的輸出,因為這些模型的運行時間通常較長,且輸出數據量可能很大。通過流式輸出,用戶可以在數據生成的過程中就接收到部分結果,從而提高效率和用戶體驗。
基于上一個案例中的2輪對話,我們再加一輪對話,此時采用流式輸出的方式,只需要調整下調用的api即可,如下:
#第三輪對話,此時返回的數據是流式的
for resp in do_msg.stream({"my_msg": [HumanMessage(content="給我講一個笑話")],"language": "中文"},config=config
): print(resp.content)
運行上面的代碼,觀察輸出效果,可以看到結果是一個一個字輸出的
3.4 向量數據庫與文檔檢索
向量數據庫是實現文檔檢索的基礎必要實現組件,類似與我們在學習es的時候,為了能從es中搜索出相似度最高的文檔,es需要先將原始存入的數據進行分詞之后再存儲。
langchain構建的向量數據庫與文檔檢索也是如此,不過文檔存儲是放在向量數據庫中,即文檔存儲之前需要先進行向量化,而后才能進行搜索。
支持從向量數據庫或其他數據源檢索數據,以便與LLM(大語言模型)的工作流集成,這對于應用程序來說非常重要,這些應用程序需要獲取數據以作為模型推理的一部分進行推理,就像檢索增強生成(RAG)的情況類似。
3.4.1 安裝向量數據庫
向量數據庫的可選組件有很多種,這里選用chroma,執行下面的命令安裝
pip install langchain-chroma
3.4.2 代碼操作示例
完整的操作步驟:
-
初始化文檔;
-
文檔存入向量數據庫,進行文檔向量化;
-
使用檢索器進行文檔檢索;
參考下面的完整代碼
from langchain_community.chat_message_histories import ChatMessageHistoryfrom langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAIfrom langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsimport osos.environ["OPENAI_API_KEY"] = 'sk-...'#提供測試數據,作為向量數據庫數據的來源
documents = [Document(page_content="狗是人類的好朋友,以忠誠和友好而文明",metadata={"source": "哺乳動物手冊"},),Document(page_content="貓是比較獨立的寵物,喜歡有自己獨立的空間,但是可以為人類提供一定的陪伴和情緒價值",metadata={"source": "哺乳動物手冊"},),Document(page_content="兔子是一種乖巧而偏靜的動物,既可以作為寵物,也可以作為家養動物",metadata={"source": "靜態寵物手冊"},),Document(page_content="老虎是一個非常兇猛的動物,但是在非洲可以作為寵物,一般是捕食性動物",metadata={"source": "大型動物手冊"},),Document(page_content="長頸鹿是一種非常呆萌可愛的動物,一般在動物園才能看到",metadata={"source": "大型動物手冊"}),
]#實例化向量空間
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查詢,返回相似度分數,分數越低,相似度越高
result = vector_store.similarity_search_with_score("東北虎")
print(result)
運行上述的代碼,通過控制臺的結果輸出不難發現,由于本次檢索的關鍵字里面包含“虎“,在原始的文檔中,與虎相關的文檔有一個,所以最終檢索的結果中,將包含老虎的那一條放在最前面,而且分數最低,這也就符合我們的預期
當然,也可以使用檢索器來做,即RunnableLambda這個對象,如下:
#實例化向量空間
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查詢,返回相似度分數,分數越低,相似度越高
# result = vector_store.similarity_search_with_score("東北虎")
# print(result)#檢索器,k=1,選取相似度最高的第一個返回
retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)target_doc = retriever.batch(['華南虎','橘貓'])
print(target_doc)
再次運行上面的代碼,此時返回了符合條件的兩個文檔
3.4.3 組合大模型組件使用
事實上,在實際使用中可能會結合大模型一起使用,比如在下面的代碼中,結合大模型與向量數據庫一起使用,同時問題通過參數的方式傳入,這樣更為靈活一點
from langchain_community.chat_message_histories import ChatMessageHistoryfrom langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAIfrom langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsfrom langchain_core.runnables import RunnableLambda,RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderimport osos.environ["OPENAI_API_KEY"] = 'sk...'#創建模型
model = ChatOpenAI(# 此處需要填入openai的key,可以直接填入,但建議最好可以配置到本地環境變量中api_key ='sk...'
)msg=[SystemMessage(content="請將下面的內容翻譯成英語."), HumanMessage(content="你好,請問你要去哪里")
]#提供測試數據,作為向量數據庫數據的來源
documents = [Document(page_content="狗是人類的好朋友,以忠誠和友好而文明",metadata={"source": "哺乳動物手冊"},),Document(page_content="貓是比較獨立的寵物,喜歡有自己獨立的空間,但是可以為人類提供一定的陪伴和情緒價值",metadata={"source": "哺乳動物手冊"},),Document(page_content="兔子是一種乖巧而偏靜的動物,既可以作為寵物,也可以作為家養動物",metadata={"source": "靜態寵物手冊"},),Document(page_content="老虎是一個非常兇猛的動物,但是在非洲可以作為寵物,一般是捕食性動物",metadata={"source": "大型動物手冊"},),Document(page_content="長頸鹿是一種非常呆萌可愛的動物,一般在動物園才能看到",metadata={"source": "大型動物手冊"}),
]#實例化向量空間
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查詢,返回相似度分數,分數越低,相似度越高
# result = vector_store.similarity_search_with_score("東北虎")
# print(result)#檢索器,k=1,選取相似度最高的第一個返回
retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)#增加提示詞模板
message="""使用提供的上下文回答這個問題:{question}上下文:{context}
"""prompt_template = ChatPromptTemplate.from_messages([('human',message)
])#動態傳遞問題,允許用戶的問題之后傳遞給prompt和model
chain = {'question':RunnablePassthrough(),'context':retriever} | prompt_template | modelresp = chain.invoke("請談談老虎")print(resp)
從輸出結果不難看出,最終的回答參考了本地向量數據庫的答案
四、寫在文末
本文通過案例詳細介紹了OpenAI 集成 Langchain 的使用,并針對Langchain的核心組件以代碼的方式進行了操作演示,希望對看到的同學有用哦,本篇到此結束,感謝觀看。