《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录

    • Langchain的定义
    • Langchain的组成
      • 三个核心组件实现
      • 整个核心组成部分
    • 为什么要使用Langchain
    • Langchain的底层原理
    • Langchain实战操作
      • LangSmith
        • LangChain调用LLM
          • 安装openAI库-国内镜像源
          • 代码
          • 运行结果
          • 小结
        • 使用Langchain的提示模板
        • 部署Langchain程序
          • 安装langserve
          • 代码
            • 请求格式
      • Langchain构建聊天机器人
        • 安装依赖
        • 代码
        • 运行结果
          • 流式输出+历史记录
          • 运行结果
    • LangChain构建向量数据库和检索器
        • 导入向量数据库依赖
        • 做一个依赖更新对齐
        • 代码
          • 运行结果
        • 检索器
          • 运行结果
        • 检索器和模型结合
    • LangChain构建代理
      • 目的
        • 定义工具
          • Tavily
            • 安转该工具依赖
            • 代码
            • 回答
          • Retriever
            • 代码
            • 运行结果
        • Agent代理使用语言模型选择工具
    • LangChain读取数据库
      • 安装依赖
      • 测试数据库是否连接成功
      • 完整代码
        • 运行结果
      • Agent整合数据库
        • 运行结果
    • 源代码下载

Langchain的定义

Langchain是一个用于由语言模型驱动的应用程序框架。

其实就是能给把大语言模型和外部的数据源(私有数据)进行结合。这个框架类似于SpringBoot框架,让用户能给直接通过它使用大语言模型。

Langchain的组成

三个核心组件实现

在这里插入图片描述

  • Compents组件:为LLMs提供封装接口、模版提示、信息检索索引,类似于jdbc的驱动程序
  • Chains链:将不同的组件组合起来解决特定的任务,比如在大量文本中查找信息
  • Agents代理:他们使得LLMs能与外部环境进行交互,例如通过API请求执行操作

整个核心组成部分

在这里插入图片描述

  • 模型Models:模型包装器,允许你连接到各种大语言模型,如GPT4或Hugging Face也包括GLM提供的模型。
  • Prompt Template:这些模版让你避免硬编码文本输入。你可以动态输入提示词,发送给大语言模型。
  • Chains:链允许多个组件组合在一起,解决特定的任务,构建完整的语言模型应用程序
  • Agents:代理允许语言模型与外部API交互
  • Embedding:嵌入与向量存储。
  • Indexes:索引帮助你从语言模型中提取相关信息

为什么要使用Langchain

理由:

  • 数据连接

Langchain允许你将大语言模型连接到你自己的数据源,比如数据库、pdf文件,可以连接你私有的数据中提取信息。

  • 行动执行

不仅可以提取信息,Langchain还可以帮助你根据这些信息执行特定的动作,比如发送邮件。

Langchain的底层原理

在这里插入图片描述

在这里插入图片描述

Langchain实战操作

LangSmith

Langsmith是一个构建生产级LLM应用程序的平台,它提供了调试、测试、评估和监控基于任何LLM框架构建的链和智能代理的功能,并且能与LangChain无缝集成。

LangSmith是LangChain的一个子产品,是一个大模型应用开发平台。它提供了从原型到生产的全流程工具和服务,帮助开发者构建、测试、评估和监控基于LangChain或其他LLM框架的应用程序。

LangChain调用LLM

那接下来狐哥带大家进入实战环境。

使用的环境:

  • pycharm
  • python3.10
安装openAI库-国内镜像源
pip install langchain-openai -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
代码
import getpass
import osfrom 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 osfrom 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 osfrom 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 osfrom 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_routesos.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 uvicornuvicorn.run(app, host="localhost", port=8000)
请求格式

POST

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

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

运行结果:

在这里插入图片描述

Langchain构建聊天机器人

构建一个聊天机器人的重点是:

  • ChatHistory:允许聊天机器人能给记住过去的互动
  • 流式输出:一个token一个token的输出
安装依赖
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_routesos.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_routesos.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 osfrom demo02 import modelos.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 RunnablePassthroughmessage = """
仅使用提供的上下文回答此问题。
{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
  • 本地索引的检索器
Tavily

LangChain内置了一个工具,可以轻松地使用Tavily搜索引擎作为工具。

Tavily是一个为大型语言模型(LLMs)和检索增强生成(RAG)优化的搜索引擎,旨在提供高效、快速且持久的搜索结果。

访问链接:

https://aishenqi.net/tool/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 TavilySearchResultssearch = 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读取数据库

安装依赖

需要安装的工具:

  • mysqlclient
  • pymsql
pip install mysqlclient
pip install pymysql

测试数据库是否连接成功

from langchain_community.utilities import SQLDatabaseHOSTNAME = '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 itemgetterfrom 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 osfrom langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthroughos.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])  # 最后一个消息是最终答案
运行结果

在这里插入图片描述

源代码下载

大家想要学习上面的实战,可以下载项目源代码:

代码地址:

《令狐的大模型实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某网盘工具,限速下载上传!

聊一聊 某度盘对于个人和未开通会员的情况下,容量还是有点小。最近自己的盘满了,还有很多东西放不进去。转眼发现正在下载的寻雷,就点进去看看寻雷盘有多大,一看,还好,比某度盘容量大。 但一想&#xff0…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令: GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装: go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

LabVIEW纤维集合体微电流测试仪

LabVIEW开发纤维集合体微电流测试仪。该设备精确测量纤维材料在特定电压下的电流变化,以分析纤维的结构、老化及回潮率等属性,对于纤维材料的科学研究及质量控制具有重要意义。 ​ 项目背景 在纤维材料的研究与应用中,电学性能是评估其性能…

Python 深拷贝与浅拷贝:数据复制的奥秘及回溯算法中的应用

引言 在 Python 编程领域,数据复制是极为常见的操作。而深拷贝和浅拷贝这两个概念,如同紧密关联却又各具特色的双子星,在数据处理过程中扮演着重要角色。深入理解它们,不仅有助于编写出高效、准确的代码,还能避免许多…

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP…

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好!今天和大家分享的是 “改进型土壤调整植被指数MSAVI”,它能够更准确地反映植被生长状态,且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数(MSAVI)是一种针对植被覆盖区域土…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版(c)八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表,双向循环链表是一种特殊的数据结构&…

稀疏混合专家架构语言模型(MoE)

注:本文为 “稀疏混合专家架构语言模型(MoE)” 相关文章合辑。 手把手教你,从零开始实现一个稀疏混合专家架构语言模型(MoE) 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后,通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后,怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识:挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代,内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容,帮助用户有效地管理信息流。随着技术的发展,传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性,这促使市场需…

想品客老师的第天:类

类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号,对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 (1)菜品管理 (2)公告管理 (3) 厨师管理 2、用…

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习,相信大家对于 Maven 这款工具的基本使用应该没什…

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method 使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

使用Pygame制作“走迷宫”游戏

1. 前言 迷宫游戏是最经典的 2D 游戏类型之一&#xff1a;在一个由墙壁和通道构成的地图里&#xff0c;玩家需要绕过障碍、寻找通路&#xff0c;最终抵达出口。它不但简单易实现&#xff0c;又兼具可玩性&#xff0c;还能在此基础上添加怪物、道具、机关等元素。本篇文章将展示…

Python之Excel操作 - 写入数据

我们将使用 openpyxl 库&#xff0c;它是一个功能强大且易于使用的库&#xff0c;专门用于处理 Excel 文件。 1. 安装 openpyxl 首先&#xff0c;你需要安装 openpyxl 库。你可以使用 pip 命令进行安装&#xff1a; pip install openpyxl创建一个文件 example.xlsx&#xff…