iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 4

Day4 GAI爆炸時代 - LangChain 基本介紹

  • 分享至 

  • xImage
  •  

接下來就要介紹一下LangChain程式碼啦
這邊帶個簡單範例來解釋一下如何運作的

from langchain_openai import AzureChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from dotenv import load_dotenv
import os

load_dotenv()

chat_model = AzureChatOpenAI(
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    azure_deployment="gpt-4o",
    openai_api_version="2023-03-15-preview",
    
)
response = chat_model.invoke('你好,請用繁體中文') # 要讓模型回覆,就使用invoke(呼叫)方法
print(response)

# 模型傳回的物件結果
print(response.pretty_print())
content='你好!有什麼我可以幫忙的嗎?' response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 14, 'total_tokens': 27}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad', 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {}} id='run-0c7670a1-83a4-48ca-95b7-3abf9857e716-0' usage_metadata={'input_tokens': 14, 'output_tokens': 13, 'total_tokens': 27}
================================== Ai Message ==================================

你好!有什麼我可以幫忙的嗎?
None
print(response)
content='你好!有什麼我可以幫忙的嗎?' response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 14, 'total_tokens': 27}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad', 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {}} id='run-0c7670a1-83a4-48ca-95b7-3abf9857e716-0' usage_metadata={'input_tokens': 14, 'output_tokens': 13, 'total_tokens': 27}
print(response.content) # 只讀取AI的回覆
你好!有什麼我可以幫忙的嗎?

一次傳送多筆訊息

結果呈現,模型目前只會針對個別訊息去獨立回覆,所以可看出第二個訊息回覆明顯不知道第一個訊息的內容

print(chat_model.batch(['金洲勇士隊的新人叫ooo','金洲勇士隊的新人叫甚麼?']))
[AIMessage(content='目前,我無法找到任何關於金州勇士隊有一位名叫ooo的新人信息。金州勇士隊(Golden State Warriors)是一支位於美國加利福尼亞州舊金山的NBA球隊,他們的球員名單和新秀名單通常會在官方網站和主要體育新聞平台上公佈。如果你有更多的具體信息或拼寫正確的名字,我可以幫助你進一步查詢。', response_metadata={'token_usage': {'completion_tokens': 107, 'prompt_tokens': 17, 'total_tokens': 124}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad', 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {}}, id='run-c0a34c39-5da4-4fd9-bc0d-1d5b247ecfc0-0', usage_metadata={'input_tokens': 17, 'output_tokens': 107, 'total_tokens': 124}), AIMessage(content='截至2023年,金州勇士隊(Golden State Warriors)的新秀是Brandon Podziemski(布蘭登·波澤姆斯基)。他是在2023年的NBA選秀中被勇士隊以第19順位選中的。布蘭登·波澤姆斯基是一名來自聖塔克拉拉大學(Santa Clara University)的後衛。', response_metadata={'token_usage': {'completion_tokens': 88, 'prompt_tokens': 18, 'total_tokens': 106}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad', 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {}}, id='run-a5be1cde-b644-400b-bcd3-2423d69ee268-0', usage_metadata={'input_tokens': 18, 'output_tokens': 88, 'total_tokens': 106})]

串流模式

chunks = chat_model.stream('你好,請使用繁體中文')  # 生成器
print(chunks)
<generator object BaseChatModel.stream at 0x000001EC99E340B0>
for c in chunks:     # 利用迴圈,就可依序印出模型傳回的生成片段內容
    print(c, end='', flush=True)
content='' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='你好' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='!' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='有' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='什' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='麼' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='我' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='可以' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='幫' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='忙' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='的' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='嗎' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='?' id='run-80c2a71e-bbca-42a4-93e5-32564db10601'content='' response_metadata={'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad'} id='run-80c2a71e-bbca-42a4-93e5-32564db10601'
for c in chat_model.stream('你好,請使用繁體中文'):     # 可直接印出內容的方法
    print(c.content, end='', flush=True)
你好!有什麼我可以幫忙的嗎?

Cache 與 計費功能

%%time
from langchain_openai import ChatOpenAI
from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache

# 初始化 chat_model
chat_model = ChatOpenAI(model='gpt-3.5-turbo', api_key='', cache=True)

# 設置緩存
set_llm_cache(InMemoryCache())

# 調用 chat_model
try:
    response = chat_model('你好,請使用繁體中文')
    print(response.id)
except Exception as e:
    print(f"An error occurred: {e}")

C:\Users\yifun\AppData\Roaming\Python\Python38\site-packages\langchain_core\_api\deprecation.py:139: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 0.3.0. Use invoke instead.
  warn_deprecated(


run-c0fc4fb7-ef37-4482-a0e5-3aa6f2950bb3-0
CPU times: total: 1.08 s
Wall time: 2.32 s

提示模板(Prompt Template)

1. 法1:直接在PromptTemplate中代入提示和模板參數

from langchain.prompts import PromptTemplate

prompt_template = PromptTemplate(template="告訴我一個關於{topic}的知識",input_variables=["topic"])
print(prompt_template)

input_variables=['topic'] template='告訴我一個關於{topic}的知識'
prompt_string = prompt_template.format(topic = "柴犬")
print(prompt_string)
告訴我一個關於柴犬的知識

2. 法2:也可以使用invoke方法代入模板參數

會建立一個StringPromptValue的物件,其中text屬性則是我們要的提示內容

prompt_value = prompt_template.invoke({"topic":"柴犬"})
print(prompt_value)

print(f"prompt_string: {type(prompt_string)}, \n"
      f"prompt_value: {type(prompt_value)},")
text='告訴我一個關於柴犬的知識'
prompt_string: <class 'str'>, 
prompt_value: <class 'langchain_core.prompt_values.StringPromptValue'>,
print(chat_model.invoke(prompt_value).content)
柴犬是源自日本的一種犬種,被認為是日本最古老的犬種之一。牠們通常具有活潑、忠誠和友善的個性,適合作為家庭寵物。柴犬的體型中等,外觀呈現狼狽的樣子,擁有一雙小巧且立耳的耳朵,以及捲曲在背上的尾巴。柴犬也以其忠誠、愛玩和獨立性而廣受歡迎。

3. 法3: 也可以使用from_template方法建立PromptTemplate物件

prompt = PromptTemplate.from_template("告訴我一個關於{topic}的知識")
print(prompt)
input_variables=['topic'] template='告訴我一個關於{topic}的知識'
# 既有的from_template要增加prompt內容作法
prompt = (PromptTemplate.from_template("告訴我一個關於{topic}的知識") + ",試著以{role}的角度說明")

print(prompt)
input_variables=['role', 'topic'] template='告訴我一個關於{topic}的知識,試著以{role}的角度說明'
prompt_value = prompt.invoke({"topic":"大便","role":"醫生對便祕者"})
print(chat_model.invoke(prompt_value).content)
便祕是一種常見的消化系統問題,通常是由於腸道中食物在消化過程中過度吸收水分,使得糞便變得乾燥且難以排出。這可能是由於飲食不均衡、缺乏運動、壓力過大或者藥物副作用等原因所導致。

當一個人長期便祕時,會導致腸道中的毒素堆積,增加罹患腸道疾病的風險。此外,便祕也可能導致腹痛、腹脹、食慾不振等不適症狀。

為了改善便祕問題,醫生通常會建議患者增加膳食纖維攝取量,多喝水,適量運動,並避免過度使用通便劑。在某些情況下,醫生可能會建議使用柔軟劑或灌腸等方法來幫助排便。

若便祕問題持續存在或伴隨其他嚴重症狀,患者應盡快就醫,以確保及時處理並排除其他潛在的健康問題。保持腸道健康對於維持整體健康至關重要,因此便祕問題不容忽視。

以上就是這節的基本語法、Prompt Template介紹,
下一節將會開始講ChatPromptTemplate、OutputParser!


上一篇
Day3 GAI爆炸時代 -開發 LLM 框架
下一篇
Day5 GAI爆炸時代 - LangChain 進階介紹 ChatPromptTemplate
系列文
LLM 應用、開發框架、RAG優化及評估方法 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言