整個核心組成部分

為什么要使用Langchain 

理由:

Langchain允許你將大語言模型連接到你自己的數據源,比如數據庫、pdf文件,可以連接你私有的數據中提取信息。

不僅可以提取信息,Langchain還可以幫助你根據這些信息執行特定的動作,比如發送郵件。

Langchain的底層原理

Langchain實戰操作 

LangSmith

Langsmith是一個構建生產級LLM應用程序的平臺,它提供了調試、測試、評估和監控基于任何LLM框架構建的鏈和智能代理的功能,并且能與LangChain無縫集成。

LangSmith是LangChain的一個子產品,是一個大模型應用開發平臺。它提供了從原型到生產的全流程工具和服務,幫助開發者構建、測試、評估和監控基于LangChain或其他LLM框架的應用程序。

LangChain調用LLM

那接下來狐哥帶大家進入實戰環境。

使用的環境:

安裝openAI庫-國內鏡像源

pip install langchain-openai -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

代碼

import getpass
import os

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = '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'

#調用大語言模型
model = ChatOpenAI(model='gpt-4o-mini')

msg = [
SystemMessage(content='請將以下的內容翻譯成意大利語'),
HumanMessage(content='你好,請問你要去哪里?')
]

result = model.invoke(msg)
print(result)

#簡單的響應解析數據
parser = StrOutputParser()
print(parser.invoke(result))

運行結果

content='Ciao, dove stai andando?' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 30, 'total_tokens': 39, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_72ed7ab54c', 'finish_reason': 'stop', 'logprobs': None} id='run-4b3c8dc2-62ab-4a5e-b327-827cd0c3ecf5-0' usage_metadata={'input_tokens': 30, 'output_tokens': 9, 'total_tokens': 39}

小結

其實上面的步驟可以總結一下,用更簡單的方式實現,通用的步驟:

import getpass
import os

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = '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'

#調用大語言模型
#1、創建大模型
model = ChatOpenAI(model='gpt-4o-mini')

#2、準備提示
msg = [
SystemMessage(content='請將以下的內容翻譯成意大利語'),
HumanMessage(content='你好,請問你要去哪里?')
]

result = model.invoke(msg)
# print(result)

#3、創建返回數據的解析器 簡單的響應解析數據
parser = StrOutputParser()
# print(parser.invoke(result))

#4、得到鏈
chain = model | parser

#5、直接使用chain來調用
print(chain.invoke(msg))
  1. 創建大模型
  2. 準備提示
  3. 創建返回數據的解析器
  4. 得到鏈
  5. 直接使用chain來調用

使用Langchain的提示模板

import getpass
import os

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = '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'

#調用大語言模型
#1、創建大模型
model = ChatOpenAI(model='gpt-4o-mini')

#2、準備提示
msg = [
SystemMessage(content='請將以下的內容翻譯成意大利語'),
HumanMessage(content='你好,請問你要去哪里?')
]

result = model.invoke(msg)
# print(result)

#3、創建返回數據的解析器 簡單的響應解析數據
parser = StrOutputParser()
# print(parser.invoke(result))

# 定義提示模板
prompt_template = ChatPromptTemplate.from_messages([
('system','請將下面的內容翻譯成{language}'),
('user','{text}')
])

#4、得到鏈
chain = prompt_template | model | parser

#5、直接使用chain來調用
# print(chain.invoke(msg))
print(chain.invoke({
'language': 'English',
'text': '你好,請問你要去哪里?'
}))

部署Langchain程序

安裝langserve

pip install "langserve[all]"

代碼

import getpass
import os

from fastapi import FastAPI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langserve import add_routes

os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = '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'

#調用大語言模型
#1、創建大模型
model = ChatOpenAI(model='gpt-4o-mini')

#2、準備提示
# msg = [
# SystemMessage(content='請將以下的內容翻譯成意大利語'),
# HumanMessage(content='你好,請問你要去哪里?')
# ]
#
# result = model.invoke(msg)
# print(result)

#3、創建返回數據的解析器 簡單的響應解析數據
parser = StrOutputParser()
# print(parser.invoke(result))

# 定義提示模板
prompt_template = ChatPromptTemplate.from_messages([
('system','請將下面的內容翻譯成{language}'),
('user','{text}')
])

#4、得到鏈
chain = prompt_template | model | parser

#5、直接使用chain來調用
# print(chain.invoke(msg))
print(chain.invoke({
'language': 'English',
'text': '你好,請問你要去哪里?'
}))

# 把我們的程序部署成服務
# 創建FastAPI應用
app = FastAPI(title='我的Langchain服務',version='1.0',description='這是一個Langchain服務-翻譯任何語句的服務')
add_routes(
app,
chain,
path="/chain",
)

if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host="localhost", port=8000)

請求格式

POST

http://localhost:8000/chain/invoke,其中invoke不能少!

{
"input":
{
"language":"English",
"text":"我要去上課了,明天和你聊天"
}
}

運行結果:

Langchain構建聊天機器人

構建一個聊天機器人的重點是:

安裝依賴

pip install langchain_community -i https://pypi.tuna.tsinghua.edu.cn/simple/

代碼

import getpass
import os
from langchain_community.chat_message_histories import ChatMessageHistory
from fastapi import FastAPI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langserve import add_routes

os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "langchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'

#聊天機器人案例
#1、創建大模型
model = ChatOpenAI(model='gpt-4o-mini')

# 定義提示模板
prompt_template = ChatPromptTemplate.from_messages([
('system','你是一個非常樂于助人的助手,請用{language}盡可能回答所有問題。'),
MessagesPlaceholder(variable_name='my_msg')
])

#4、得到鏈
chain = prompt_template | model

#保存歷史聊天記錄
store = {} #所有用戶的聊天記錄都保存在store里。key:sessionId ,value:歷史聊天記錄對象

#此函數預期將接受一個session_id,并返回一個包含所有歷史聊天記錄對象
def get_session_history(session_id:str):
if session_id not in store:
store[session_id] = ChatMessageHistory()#創建一個空的歷史聊天記錄對象
return store[session_id]

do_message = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key='my_msg'#每次聊天的時候發送msg的key
)

config = {'configurable':{'session_id':'zs123'}}#給當前會話頂一個session_id

#第一輪聊天發出去的信息
resp = do_message.invoke(
{
'my_msg':[HumanMessage(content='你好,我是令狐!')],
'language':'中文'
},
config=config
)

print(resp.content)

#第二輪聊天發出去的信息
resp = do_message.invoke(
{
'my_msg':[HumanMessage(content='請問我的名字是什么?')],
'language':'中文'
},
config=config
)

print(resp.content)

運行結果

流式輸出+歷史記錄

import getpass
import os
from langchain_community.chat_message_histories import ChatMessageHistory
from fastapi import FastAPI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langserve import add_routes

os.environ["http_proxy"] = "127.0.0.1:7890"
os.environ["https_proxy"] = "127.0.0.1:7890"

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "langchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'

#聊天機器人案例
#1、創建大模型
model = ChatOpenAI(model='gpt-4o-mini')

# 定義提示模板
prompt_template = ChatPromptTemplate.from_messages([
('system','你是一個非常樂于助人的助手,請用{language}盡可能回答所有問題。'),
MessagesPlaceholder(variable_name='my_msg')
])

#4、得到鏈
chain = prompt_template | model

#保存歷史聊天記錄
store = {} #所有用戶的聊天記錄都保存在store里。key:sessionId ,value:歷史聊天記錄對象

#此函數預期將接受一個session_id,并返回一個包含所有歷史聊天記錄對象
def get_session_history(session_id:str):
if session_id not in store:
store[session_id] = ChatMessageHistory()#創建一個空的歷史聊天記錄對象
return store[session_id]

do_message = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key='my_msg'#每次聊天的時候發送msg的key
)

config = {'configurable':{'session_id':'zs123'}}#給當前會話頂一個session_id

#第一輪聊天發出去的信息
resp = do_message.invoke(
{
'my_msg':[HumanMessage(content='你好,我是令狐!')],
'language':'中文'
},
config=config
)

print(resp.content)

#第二輪聊天發出去的信息
resp = do_message.invoke(
{
'my_msg':[HumanMessage(content='請問我的名字是什么?')],
'language':'中文'
},
config=config
)

print(resp.content)

#重新換一輪對話
config = {'configurable':{'session_id':'ls123'}}#給當前會話頂一個session_id
#第三輪聊天發出去的信息,每一次resp都是你一個token
for resp in do_message.stream(
{
'my_msg':[HumanMessage(content='請給我講一個笑話')],
'language':'English'
},
config=config
):
print(resp.content,end='-')#每一次resp都是你一個token

運行結果

LangChain構建向量數據庫和檢索器 

支持從向量數據庫和其他來源檢索數據,方便與LLM大語言模型工作流程集成。

注:在這里我換了,我使用了阿里的靈積模型!OpenAI太難用了,有速率限制。

from langchain_community.embeddings import DashScopeEmbeddings

工作流程如下:

導入向量數據庫依賴

pip install langchain-chroma -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

做一個依賴更新對齊

為啥要做呢,因為中間搭建過程Chroma 報錯,Process finished with exit code….

大家做個下面的依賴更新就好了:

pip install chromadb==0.5.3 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

代碼

from langchain_core.documents import Document

# 構造文檔
documents = [
Document(
page_content="狗是很好的伴侶,以忠誠和友善而聞名。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="貓是獨立的寵物,經常享受自己的空間。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="金魚是深受初學者歡迎的寵物,需要相對簡單的護理。",
metadata={"source": "fish-pets-doc"},
),
Document(
page_content="鸚鵡是一種聰明的鳥類,能夠模仿人類的語言。",
metadata={"source": "bird-pets-doc"},
),
Document(
page_content="兔子是群居動物,需要足夠的空間來跳躍。",
metadata={"source": "mammal-pets-doc"},
),
]

from langchain_chroma import Chroma
from langchain_community.embeddings import DashScopeEmbeddings

#實例化一個向量數據庫=向量空間
vectorstore = Chroma.from_documents(
documents,
embedding=DashScopeEmbeddings(),
)

#相似度查詢:返回相似的分數,分數越低相似度越高
result = vectorstore.similarity_search_with_score("貓")
print(result)

運行結果

[(Document(id='bca6c27d-f9ec-4ef4-912c-1b5da9d37be2', metadata={'source': 'mammal-pets-doc'}, page_content='貓是獨立的寵物,經常享受自己的空間。'), 6132.1220703125), (Document(id='86c5141f-7af9-4c9a-8164-06f07ed8e5f0', metadata={'source': 'mammal-pets-doc'}, page_content='狗是很好的伴侶,以忠誠和友善而聞名。'), 9821.1064453125), (Document(id='72a6ac79-b714-4430-aec3-ba032534d913', metadata={'source': 'mammal-pets-doc'}, page_content='兔子是群居動物,需要足夠的空間來跳躍。'), 12847.7138671875), (Document(id='92827b7f-b7fc-43df-bd5d-39723a09590d', metadata={'source': 'bird-pets-doc'}, page_content='鸚鵡是一種聰明的鳥類,能夠模仿人類的語言。'), 13557.162109375)]
相似度查詢:返回相似的分數,分數越低相似度越高

檢索器

選取相似度最高的結果返回。

#相似度查詢:返回相似的分數,分數越低相似度越高
retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)#選擇頂部結果
from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda
import os
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'

# 構造文檔
documents = [
Document(
page_content="狗是很好的伴侶,以忠誠和友善而聞名。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="貓是獨立的寵物,經常享受自己的空間。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="金魚是深受初學者歡迎的寵物,需要相對簡單的護理。",
metadata={"source": "fish-pets-doc"},
),
Document(
page_content="鸚鵡是一種聰明的鳥類,能夠模仿人類的語言。",
metadata={"source": "bird-pets-doc"},
),
Document(
page_content="兔子是群居動物,需要足夠的空間來跳躍。",
metadata={"source": "mammal-pets-doc"},
),
]

from langchain_chroma import Chroma
from langchain_community.embeddings import DashScopeEmbeddings

#實例化一個向量數據庫=向量空間
vectorstore = Chroma.from_documents(
documents,
embedding=DashScopeEmbeddings(),
)

#相似度查詢:返回相似的分數,分數越低相似度越高
retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)#選擇頂部結果

result = retriever.batch(["貓","鯊魚"])
print(result)

運行結果

D:\CompanyWork\Environment\python3.10\python.exe D:\PersonWork\Projects\PythonProjects\lang-chain-demo\demo05.py 
D:\CompanyWork\Environment\python3.10\lib\site-packages\langchain\__init__.py:30: UserWarning: Importing debug from langchain root module is no longer supported. Please use langchain.globals.set_debug() / langchain.globals.get_debug() instead.
warnings.warn(
[[Document(id='7eaa6607-e462-40c2-9cc1-268c0b6f986e', metadata={'source': 'mammal-pets-doc'}, page_content='貓是獨立的寵物,經常享受自己的空間。')], [Document(id='a27dfea6-1b2f-41f7-ad7a-91861ff0bcd1', metadata={'source': 'fish-pets-doc'}, page_content='金魚是深受初學者歡迎的寵物,需要相對簡單的護理。')]]

Process finished with exit code 0

檢索器和模型結合

from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
import os

from demo02 import model

os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'
os.environ["OPENAI_API_KEY"] = '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'

# 構造文檔
documents = [
Document(
page_content="狗是很好的伴侶,以忠誠和友善而聞名。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="貓是獨立的寵物,經常享受自己的空間。",
metadata={"source": "mammal-pets-doc"},
),
Document(
page_content="金魚是深受初學者歡迎的寵物,需要相對簡單的護理。",
metadata={"source": "fish-pets-doc"},
),
Document(
page_content="鸚鵡是一種聰明的鳥類,能夠模仿人類的語言。",
metadata={"source": "bird-pets-doc"},
),
Document(
page_content="兔子是群居動物,需要足夠的空間來跳躍。",
metadata={"source": "mammal-pets-doc"},
),
]

# 構造 prompt
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

message = """
僅使用提供的上下文回答此問題。
{question}

上下文:
{context}
"""
prompt = ChatPromptTemplate.from_messages([("human", message)])

from langchain_chroma import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
# 創建 Chroma 向量存儲
vectorstore = Chroma.from_documents(
documents,
embedding=DashScopeEmbeddings(),
)

# 查詢向量存儲
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 1},
)

# 使用 Tongyi LLM,并設置溫度為 1,代表模型會更加隨機,但也會更加不確定
from langchain_community.llms import Tongyi
llm = Tongyi(temperature=1)

# 構建 RAG 鏈
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

# 使用 RAG 鏈并打印結果
response = rag_chain.invoke("告訴我關于貓的事")
print(response)

LangChain構建代理 

語言模型本身無法執行動作,它們只能輸出文本。LangChain的一個重要用例是創建代理。代理是使用大型語言模型(LLM)作為推理引擎來確定要執行的操作以及這些操作的輸入應該是什么。然后,這些操作的結果可以反饋到代理中,代理將決定是否需要更多的操作,或者是否可以結束。

目的

在本教程中,我們將構建一個可以與多種不同工具交互的代理:一個是本地數據庫,另一個是搜索引擎。你將能夠向這個代理提問,觀察它調用工具,并與它進行對話。

定義工具

本教程我們使用到的工具有兩個:

Tavily

LangChain內置了一個工具,可以輕松地使用Tavily搜索引擎作為工具。

Tavily是一個為大型語言模型(LLMs)和檢索增強生成(RAG)優化的搜索引擎,旨在提供高效、快速且持久的搜索結果。

訪問鏈接:

Tavily

安轉該工具依賴

pip install -U langchain-community tavily-python langgraph

代碼

import os
os.environ["TAVILY_API_KEY"] = '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'
from langchain_community.tools.tavily_search import TavilySearchResults

search = TavilySearchResults(max_results=1)

result = search.invoke("今天秦皇島的天氣預報")
print(result)

回答

[{'url': 'https://hebeim.weather.com.cn/mweather1d/101091101.shtml', 'content': '秦皇島天氣預報,及時準確發布中央氣象臺天氣信息,便捷查詢北京今日天氣,秦皇島周末天氣,秦皇島一周天氣預報,秦皇島15日天氣預報,秦皇島40日天氣預報,秦皇島天氣預報還提供秦皇島各區縣的生活指數、健康指數、交通指數、旅游指數,及時發布秦皇島氣象預警信號、各類氣象資訊。'}]

Retriever

在自定義的數據上去構建一個檢索器。

安裝依賴

pip install faiss-cpu -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
pip install bs4 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

代碼

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
import os
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'

loader = WebBaseLoader("https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, DashScopeEmbeddings())
retriever = vector.as_retriever()

result = retriever.invoke("靈積模型是什么?")
print(result)

運行結果

[
{
"id": "ec94332a-57f9-4a31-9dd3-8d2733402292",
"metadata": {
"source": "https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5",
"title": "什么是DashScope靈積模型服務_模型服務靈積(DashScope)-阿里云幫助中心",
"description": "DashScope通過標準化的API提供“模型即服務”(Model-as-a-Service,MaaS)。不同于以往以任務為中心的AI API,DashScope構建在面向未來的、以模型為中心的理念下,因此也引入了一些新的概念和術語。開發者可以通過本文了解DashScope的有關概念和術語,從而更好...",
"language": "zh"
},
"page_content": "什么是DashScope靈積模型服務_模型服務靈積(DashScope)-阿里云幫助中心\n\n\n\n\n\n\n\n\n\n\n\n\n大模型產品解決方案文檔與社區權益中心定價云市場合作伙伴支持與服務了解阿里云AI 助理備案控制臺\n文檔輸入文檔關鍵字查找\n模型服務靈積\n\n\n\n\n產品概述\n\n\n\n\n\n快速入門\n\n\n\n\n\n操作指南\n\n\n\n\n\n開發參考\n\n\n\n\n\n實踐教程\n\n\n\n\n\n服務支持\n\n\n\n首頁\n\n\n\n模型服務靈積\n\n\n\n產品概述"
},
{
"id": "12f0a6b3-4cd0-4652-aa7e-9e55e5f3fb4f",
"metadata": {
"source": "https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5",
"title": "什么是DashScope靈積模型服務_模型服務靈積(DashScope)-阿里云幫助中心",
"description": "DashScope通過標準化的API提供“模型即服務”(Model-as-a-Service,MaaS)。不同于以往以任務為中心的AI API,DashScope構建在面向未來的、以模型為中心的理念下,因此也引入了一些新的概念和術語。開發者可以通過本文了解DashScope的有關概念和術語,從而更好...",
"language": "zh"
},
"page_content": "模型服務靈積-Chat\n\n\n通義千問計量計費說明\n\n\n通過API使用通義千問\n\n\n模型體驗中心\n\n\nAPI-KEY的獲取與配置\n\n\n模型服務靈積產品升級通知\n\n\n快速入門\n\n\n使用異步任務\n\n\n\n文檔內容是否對您有幫助?是否反饋\n為什么選擇阿里云什么是云計算全球基礎設施技術領先穩定可靠安全合規分析師報告產品和定價全部產品免費試用產品動態產品定價價格計算器云上成本管理解決方案技術解決方案文檔與社區文檔開發者社區天池大賽培訓與認證權益中心免費試用高校計劃企業扶持計劃推薦返現計劃支持與服務基礎服務企業增值服務遷云服務官網公告健康看板信任中心關注阿里云關注阿里云公眾號或下載阿里云APP,關注云資訊,隨時隨地運維管控云服務聯系我們:4008013260法律聲明Cookies政策廉正舉報安全舉報聯系我們加入我們友情鏈接阿里巴巴集團淘寶網天貓全球速賣通阿里巴巴國際交易市場1688阿里媽媽飛豬阿里云計算AliOS萬網高德UC友盟優酷釘釘支付寶達摩院淘寶海外阿里云盤餓了么? 2009-2025 Aliyun.com 版權所有 增值電信業務經營許可證: 浙B2-20080101 域名注冊服務機構許可: 浙D3-20210002浙公網安備 33010602009975號浙B2-20080101-4"
},
{
"id": "da3f0056-02de-480f-8a4c-e25f67c8cc26",
"metadata": {
"source": "https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5",
"title": "什么是DashScope靈積模型服務_模型服務靈積(DashScope)-阿里云幫助中心",
"description": "DashScope通過標準化的API提供“模型即服務”(Model-as-a-Service,MaaS)。不同于以往以任務為中心的AI API,DashScope構建在面向未來的、以模型為中心的理念下,因此也引入了一些新的概念和術語。開發者可以通過本文了解DashScope的有關概念和術語,從而更好...",
"language": "zh"
},
"page_content": "上一篇:產品簡介下一篇:產品計費 \n文檔推薦"
},
{
"id": "e7727ea5-fcd0-446a-9ba7-e87a81fece7c",
"metadata": {
"source": "https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5",
"title": "什么是DashScope靈積模型服務_模型服務靈積(DashScope)-阿里云幫助中心",
"description": "DashScope通過標準化的API提供“模型即服務”(Model-as-a-Service,MaaS)。不同于以往以任務為中心的AI API,DashScope構建在面向未來的、以模型為中心的理念下,因此也引入了一些新的概念和術語。開發者可以通過本文了解DashScope的有關概念和術語,從而更好...",
"language": "zh"
},
"page_content": "基本概念\n基本概念更新時間:產品詳情我的收藏"
}
]

具體應用場景:未使用工具:直接調用語言模型,例如問候語 “你好”。建議使用工具:search_dashscope_knowledge:當需要搜索特定知識時,例如 “靈積模型是什么”。建議使用工具:multiply:當需要計算數學問題時,例如 “計算 10 的 5 倍”。通過這種方式,代碼可以根據不同的輸入選擇合適的工具,從而提高回答的準確性和效率。

Agent代理使用語言模型選擇工具

import os
os.environ["TAVILY_API_KEY"] = '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'
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=1)

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, DashScopeEmbeddings())
retriever = vector.as_retriever()

from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"search_dashscope_knowledge",
"當需要搜索靈積模型相關知識的時候必須使用該工具",
)

from langchain_core.tools import tool
@tool
def multiply(first_int: int, second_int: int) -> int:
"""兩個數的乘積."""
return first_int * second_int

# 創建工具列表
toolList = [search, retriever_tool, multiply]

from langchain_community.chat_models.tongyi import ChatTongyi
llm = ChatTongyi(model="qwen-max")
llm_with_tools = llm.bind_tools([search, retriever_tool, multiply])

# 未使用工具
msg = llm.invoke("你好")
print(msg)

# 建議使用工具:search_dashscope_knowledge
msg = llm_with_tools.invoke("靈積模型是什么")
print(msg)

# 建議使用工具:multiply
msg = llm_with_tools.invoke("計算 10 的 5 倍")
print(msg)

這還沒有調用那個工具——大模型只是告訴我們建議使用哪個工具。為了真正調用它,下面我們需要創建我們的代理。

import os
from langchain_core.messages import HumanMessage
os.environ["TAVILY_API_KEY"] = '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'
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=1)
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://help.aliyun.com/zh/dashscope/product-overview/concepts-and-glossary?spm=a2c4g.11186623.0.0.63955491NXmvJ5")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, DashScopeEmbeddings())
retriever = vector.as_retriever()

from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"search_dashscope_knowledge",
"當需要搜索靈積模型相關知識的時候必須使用該工具",
)

from langchain_core.tools import tool
@tool
def multiply(first_int: int, second_int: int) -> int:
"""兩個數的乘積."""
return first_int * second_int

# 創建工具列表
toolList = [search, retriever_tool, multiply]

from langchain_community.chat_models.tongyi import ChatTongyi
llm = ChatTongyi(model="qwen-max")
llm_with_tools = llm.bind_tools([search, retriever_tool, multiply])

# # 未使用工具
# msg = llm.invoke("你好")
# print(msg)
#
# # 建議使用工具:search_dashscope_knowledge
# msg = llm_with_tools.invoke("靈積模型是什么")
# print(msg)
#
# # 建議使用工具:multiply
# msg = llm_with_tools.invoke("計算 10 的 5 倍")
# print(msg)

from langgraph.prebuilt import create_react_agent
#創建一個代理
agent_executor = create_react_agent(llm,toolList)

#該提問沒有調用工具
print("====沒有調用工具的情況=====")
msg = agent_executor.invoke(
{"messages": [HumanMessage(content="你好")]}
)
print(msg)
print("====使用工具:search_dashscope_knowledge的情況=====")
# 建議使用工具:search_dashscope_knowledge
msg = agent_executor.invoke(
{"messages": [HumanMessage(content="靈積模型是什么")]}
)
print(msg)
print("====使用工具:multiply的情況=====")
# 建議使用工具:multiply
msg = llm_with_tools.invoke("計算 10 的 5 倍等于的結果")
print(msg)

上面的代碼中,代理agent_executor會根據content的內容變化而自動選擇工具去執行。

LangChain讀取數據庫 

安裝依賴

需要安裝的工具:

pip install mysqlclient
pip install pymysql

測試數據庫是否連接成功

from langchain_community.utilities import SQLDatabase

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mybatis_plus'
USERNAME = 'root'
PASSWORD = '123456'
MYSQL_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'

db = SQLDatabase.from_uri(MYSQL_URI)

#測試連接是否成功
print(db.get_usable_table_names())
print(db.run('select * from t_user limit 10;'))

完整代碼

from operator import itemgetter

from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.tools import QuerySQLDatabaseTool
from langchain_community.utilities import SQLDatabase
from langchain_community.chat_models.tongyi import ChatTongyi
import os

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough

os.environ["TAVILY_API_KEY"] = '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'
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'
##創建大模型
llm = ChatTongyi(model="qwen-max")
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mybatis_plus'
USERNAME = 'root'
PASSWORD = '123456'
MYSQL_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'

db = SQLDatabase.from_uri(MYSQL_URI)

#測試連接是否成功
# print(db.get_usable_table_names())
# print(db.run('select * from t_user limit 10;'))

#直接使用大模型和數據庫整合
test_chain = create_sql_query_chain(llm, db)
#生成sql語句
# print(test_chain.invoke({'question': '請問:用戶表里有多少人?'}))

answer_prompt = PromptTemplate.from_template("""
給定以下用戶問題、SQL語句和SQL執行后的結果,回答用戶的問題。
Question: {question}
SQL Query: {query}
SQL Result: {result}
回答:"""
)
#創建一個執行sql語句的工具
execute_sql_tool = QuerySQLDatabaseTool(db=db)

#1、生成SQL;2、執行SQL
chain = (
RunnablePassthrough.assign(query=lambda x: test_chain.invoke(x).replace('SQLQuery: ', '').strip().replace("`", ""))
| RunnablePassthrough.assign(result=lambda x: execute_sql_tool.invoke({"query": x["query"]}))
| answer_prompt
| llm
| StrOutputParser()
)

print(chain.invoke({'question': '請問:用戶表里有多少人?'}))

運行結果

Agent整合數據庫

其實上面整合數據庫的方法過于復雜,現在用一種簡單的方式進行整合——Agent

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import SQLDatabaseToolkit
import os
os.environ["TAVILY_API_KEY"] = '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'
os.environ["DASHSCOPE_API_KEY"] = 'sk-5bc0688c5761427cadb9df012e589136'

# 創建大模型
llm = ChatTongyi(model="qwen-max")

# 數據庫連接信息
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mybatis_plus'
USERNAME = 'root'
PASSWORD = '123456'
MYSQL_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'

# 連接數據庫
db = SQLDatabase.from_uri(MYSQL_URI)

# 創建工具
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()

system_prompt = """
您是一個被設計用來與SQL數據庫交互的智能助手。
您的任務是:
1. **分析用戶問題**,并創建一個 **正確的 SQL 查詢**。
2. **執行 SQL 查詢** 并返回相應的 **查詢結果**。
3. **解讀查詢結果**,用 **自然語言** 向用戶反饋答案。
4. **限制查詢數據量**,除非用戶明確指定,否則默認最多返回 10 條數據。
5. **不得執行任何修改數據庫的操作(INSERT、UPDATE、DELETE 等)**。
6. **先查看數據庫中的表結構**,然后再執行查詢,以確保 SQL 語句的正確性。
"""

# **使用 ChatPromptTemplate 來支持 system_message**
prompt = ChatPromptTemplate.from_messages([
SystemMessage(content=system_prompt),
MessagesPlaceholder(variable_name="messages")
])

# **正確創建 agent**
agent_executor = create_react_agent(llm, tools, prompt=prompt)

# 發送查詢請求
resp = agent_executor.invoke(
{
"messages": [HumanMessage(content="請問:員工表中有多少人?")]
}
)

# 獲取返回的消息列表
result = resp['messages']

# 輸出最終答案
print(result)
print(len(result))
print(result[-1]) # 最后一個消息是最終答案

運行結果

源代碼下載 

大家想要學習上面的實戰,可以下載項目源代碼:

代碼地址:

《令狐的大模型實戰》

本文章轉載微信公眾號@CodeLinghu

上一篇:

Java開發者LLM實戰——使用LangChain4j構建本地RAG系統

下一篇:

LangChain + GPT :總結長文本
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費