langchain實戰-從0到1搭建ai聊天機器人

介紹

當前,人工智能大模型公司如雨后春筍般迅速涌現,例如 OpenAI、文心一言、通義千問等,它們提供了成熟的 API 調用服務。然而,隨之而來的是不同公司的繁瑣協議接入過程,這讓許多開發者感到頭疼不已。有沒有一種統一的工具,能夠讓我們一次性接入所有公司的 API 協議,并且基于它們的底層能力封裝出各種酷炫功能呢?今天,這樣的工具終于來了——Langchain,它以堅實的步伐走來,為我們帶來了極大的便利和創新。

Langchain 是一個專為適配各家大模型 API 而生的框架,不僅如此,它還封裝了各種重要模塊,使得大家能夠輕松搭建出各種令人驚嘆的人工智能應用。以下代碼基于 langchain 2.0 版本實現

模塊介紹:

  • Model:?這一模塊的重要性不言而喻。Langchain 的 Model 模塊致力于適配各大模型公司的接口協議,使得接入過程更加簡單和高效。不再需要為每個公司的特殊協議而煩惱,Langchain 幫助您一次性搞定。

  • Prompt:?提示詞的運用是大模型輸出準確性的關鍵。Langchain 的 Prompt 模塊不僅讓大模型能更準確地輸出我們期望的回答,還衍生出了“提示工程”。建議在使用大模型之前先查看提示工程,以獲得更好的結果和體驗。

  • History:?大模型本身并不具備記憶功能,這帶來了一個看似矛盾的問題:為什么像 ChatGPT 這樣的模型能夠聯系到我們之前的提問并給出相關回復呢?Langchain 的 History 模塊揭示了這個謎團的解答。其實,實現原理非常簡單,只需將你的上一個提問一并發送給大模型即可。當然,實際實現中還涉及一些問題,比如如何標識同一輪對話、信息存儲位置、處理過多文本等等。因此,需要自行實現部分邏輯,但 Langchain 為您提供了思路和基礎。

言歸正傳,讓我們開始實戰代碼,探索 Langchain 帶來的無限可能吧!

快速開始

1. 先安裝依賴,以openai為例

pip install langchainpip install -qU langchain-openai

2. 初始化model

import osos.environ["OPENAI_API_KEY"] = "sk-xxx"from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-3.5-turbo")

3. 發起請求

from langchain_core.messages import HumanMessageresponse = model.invoke([HumanMessage(content="你好")])response.content

4.得到回答

'你好!有什么可以幫助你的嗎?'

🎉 恭喜你,你已經可以成功使用langchain調用大模型api了

加入歷史記憶實現連續對話

經過以上步驟,你已經可以跟大模型進行聊天,但是有個問題,現在他是不會記憶上一輪的回答的,你上一句問他東西,他轉頭就忘了,那該怎么辦呢?那就給他加上歷史記憶好了

# 沒有 history memoryfrom langchain_core.messages import HumanMessagequestion_1 = "你好,我叫小明"
result_1 = model.invoke([HumanMessage(content=f"{question_1}")])
print(result_1.content)question_2 = "我叫什么名字"
result_2 = model.invoke([HumanMessage(content=f"{question_2}")])
print(result_2.content)

返回結果

你好,小明!有什么可以幫助你的嗎?
抱歉,我無法回答這個問題,因為我不知道您的名字。您可以告訴我您的名字嗎?我會很高興稱呼您的名字。

開頭也說了,大模型是沒有記憶功能的,目前業界的實現方式都是通過各自實現存儲,在聊天中將上一輪的問答也一起發送過去,讓大模型有了“記憶”,那最簡單的方法就是用個list存儲,然后每次回答都帶上去就好了

# 簡單實現 history memoryfrom langchain_core.messages import HumanMessagestore = []question_1 = "你好,我叫小明"
result_1 = model.invoke([HumanMessage(content=f"{question_1}")])
print(result_1.content)store.append({"human": question_1, "ai": result_1.content})question_2 = "我叫什么名字"
result_2 = model.invoke([HumanMessage(content=f"history: {store} {question_2} ")])
print(result_2.content)

返回結果:

你好,小明!有什么可以幫助你的嗎?
你的名字是小明。有什么可以幫助你的嗎?如果有任何問題,隨時問我吧!

神奇的事情發生了,大模型有“記憶”了?

當然,langchain也為我們提供了方便的實現,讓我們不用顯式的寫history

pip install langchain_community
# 使用官方模塊實現from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistorystore = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]with_message_history = RunnableWithMessageHistory(model, get_session_history)config = {"configurable": {"session_id": "abc2"}}question_1 = "你好,我叫小明"
result_1 = with_message_history.invoke([HumanMessage(content=f"{question_1}")],config=config)
print(result_1.content)question_2 = "我叫什么名字"
result_2 = with_message_history.invoke([HumanMessage(content=f"{question_2}")],config=config)
print(result_2.content)
你好小明,有什么可以幫助你的嗎?
你告訴我你叫小明。

同時langchain還提供了更多類型的memory實現,讓我們可以使用redis去存儲歷史記錄,這個就留給大家自己實現了 ?Redis | 🦜?🔗 LangChain

加入提示詞prompt格式化回答

在上述的實現中,我們的做法就是簡單的字符串拼接發送給大模型,使用prompt可以讓我們更好的格式化我們的輸入

# 加入promptfrom langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderstore = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]prompt = ChatPromptTemplate.from_messages([("system","在每一句話結尾都加上 回復完畢",),MessagesPlaceholder(variable_name="messages"),]
)chain = prompt | modelwith_message_history = RunnableWithMessageHistory(chain, get_session_history)config = {"configurable": {"session_id": "abc2"}}question_1 = "你好,我叫小明"
result_1 = with_message_history.invoke([HumanMessage(content=f"{question_1}")],config=config)
print(result_1.content)question_2 = "我叫什么名字"
result_2 = with_message_history.invoke([HumanMessage(content=f"{question_2}")],config=config)
print(result_2.content)
你好,小明。有什么可以幫助你的嗎?回復完畢
您的名字是小明。回復完畢

🎉 這樣你就完成了一個能連續對話的ai機器人啦

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15184.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15184.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15184.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot + Redis實現對接口的限流

目錄 前言 什么是限流? 實現限流 創建一個注解類 接著創建一個切面類 前言 在項目中,對于接口的限流,是任何項目都必不可少的一部分,主要是為了防止用戶頻繁的發送請求,對服務器造成壓力。 另外一點就是防止外來攻…

C++之第八課

課程列表 今天我們來學一學C里的一些實用的東西。 1.域寬 說到域寬setw&#xff0c;就叒要加頭文件了。 #include<iomanip> 使用格式是&#xff1a; cout<<setw(5)<<"123"; setw括號里面可以改數字&#xff0c;后面就是輸出內容了&#xff…

COD論文筆記 Boundary-Guided Camouflaged Object Detection

動機 挑戰性任務&#xff1a;偽裝物體檢測&#xff08;COD&#xff09;是一個重要且具有挑戰性的任務&#xff0c;因為偽裝物體往往與背景高度相似&#xff0c;使得準確識別和分割非常困難。現有方法的不足&#xff1a;現有的深度學習方法難以有效識別偽裝物體的結構和細節&am…

MySQL索引、視圖練習

素材 1.學生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 學號&#xff0c;姓名&#xff0c;性別&#xff0c;年齡&#xff0c;所在系 Sno為主鍵 2.課程表&#xff1a;Course (Cno, Cname,) 課程號&#xff0c;課程名 Cno為主鍵 3.學生選課表&#xff1a;SC (Sno…

Home Credit - Credit Risk Model Stability

本篇是對Kaggle上Home Credit - Credit Risk Model Stability競賽中的開源代碼VotingClassifier Home Credit的解讀。原鏈接在VotingClassifier Home Credit (kaggle.com)。 %%writefile script.py import sys from pathlib import Path import subprocess import os import g…

人工智能的發展現狀,AI將如何改變IT行業,哪些職業將最先失業

文章目錄 一、人工智能的發展現狀1、技術進展與突破2、商業應用與市場3、挑戰與問題4、未來趨勢 二、AI將如何改變IT行業1、工作方式的轉變&#xff1a;2、未來發展的推動&#xff1a;3、用戶服務和體驗的提升&#xff1a;4、創新和轉型的推動&#xff1a;5、融入日常生活和工作…

淺談JMeter運行原理

淺談JMeter運行原理 JMeter架構基礎 JMeter基于Java平臺開發&#xff0c;運行于Java虛擬機&#xff08;JVM&#xff09;之上。這意味著它可以在任何支持JVM的操作系統上運行&#xff0c;包括Windows、Linux、macOS等。其核心架構設計圍繞著多線程執行機制&#xff0c;這使得它…

AI大模型探索之路-實戰篇6: Function Calling技術調研之詳細流程剖析

系列篇章&#x1f4a5; AI大模型探索之路-實戰篇4&#xff1a;DB-GPT數據應用開發框架調研實踐 AI大模型探索之路-實戰篇5&#xff1a; Open Interpreter開放代碼解釋器調研實踐 目錄 系列篇章&#x1f4a5;一、前言二、Function Calling詳細流程剖析1、創建OpenAI客戶端2、定…

PCL 法向量加權的RANSAC擬合分割平面

目錄 一、算法原理1、原理概述2、主要函數二、代碼實現三、結果展示四、相關鏈接本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲。 一、算法原理 1、原理概述

鴻蒙布局List簡介

鴻蒙布局List簡介 List--常見的布局容器List 創建方式創建方式一&#xff0c;通過Listitem創建方式二&#xff0c;通過ForEach和Listitem創建方式三&#xff0c;通過ListItemGroup List–常見的布局容器 List是在app開發中最常見的一種布局方式&#xff0c;例如通訊錄、新聞列…

Wpf 使用 Prism 實戰開發Day24

自定義詢問窗口 當需要關閉系統或進行刪除數據或進行其他操作的時候&#xff0c;需要詢問用戶是否要執行對應的操作。那么就需要一個彈窗來給用戶進行提示。 一.添加自定義詢問窗口視圖 (MsgView.xaml) 1.首先&#xff0c;添加一個自定義詢問窗口視圖 (MsgView.xaml) <Use…

域內攻擊 ----->約束非約束委派攻擊

在域中&#xff0c;除了我們常見的橫向移動以外&#xff0c;還有很多攻擊&#xff0c;像什么kerberoasting&#xff0c;委派攻擊&#xff0c;NTLMrelay啊...... 還有很多&#xff08;暫時只知道這些&#xff09; 以前在一篇公眾號看到的一個笑話也薈萃了網安的一些攻擊手法&am…

vscode終端運行pnpm,yarn不成功問題

vscode終端運行pnpm&#xff0c;yarn不成功問題 1.問題描述2.解決辦法 1.問題描述 全局安裝了pnpm后&#xff0c;cmd窗口執行pnpm -v可以查看版本信息&#xff0c;在項目目錄可以執行操作&#xff0c;但是在vscode中無法執行并報錯 2.解決辦法 以管理員身份運行vscode打開vscod…

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello World C語言程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

深入理解ECMAScript:JavaScript的規范與實踐

引言 在當今的Web開發領域&#xff0c;JavaScript幾乎無處不在。它不僅在客戶端編程中占據主導地位&#xff0c;而且在服務器端&#xff08;Node.js&#xff09;和移動應用開發中也越來越受歡迎。然而&#xff0c;JavaScript的核心并非由單一的公司或組織控制&#xff0c;而是…

初識Java--開啟我的Java學習之旅

目錄 一、JAVA語言概述二、JAVA語言的重要性2.1語言使用廣泛程度2.2工作領域2.3在校招崗位的需求2.4 java語言發展簡史2.5Java語言特性 三、初識java的main方法四、運行java程序五、【面試題】JDK、JRE、JVM之間的關系&#xff1f; 一、JAVA語言概述 Java是一種優秀的程序設計…

【Apache Doris】周FAQ集錦:第 4 期

【Apache Doris】周FAQ集錦&#xff1a;第 4 期 SQL問題數據操作問題運維常見問題其它問題關于社區 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和…

Redis常見數據類型(6)-set, zset

目錄 Set 命令小結 內部編碼 使用場景 用戶畫像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ?編輯 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小結 …