LangChain大模型操作数据库全攻略:从MCP到Tools再到SQL生成,一篇搞定大模型与数据库交互!

基于AI MCP协议, 写一个MCP服务用于连接数据库执行sql 它的核心功能是打通AI模型与外部工具、数据源的桥梁,让AI不仅能回答问题,还能直接调用API、操作本地文件、访问数据库等,实现自动化任务处理。简单的说, 它就相当于一个主板, 它可以插入各种各样的usb(工具, 服务, 接口), 然后经过cpu(ai)来分析上下文, 决定调用哪些usb来完成任务.废话不多说, 那如果我们希望ai能连接数据库, 做一些sql分析啊, sql执行啊, 这个usb(如果AI模型是“大脑”,MCP则相当于“手和脚”,让大脑的指令能转化为实际动作。Cursor 编辑器。 阅读详情

🚀零基础也能轻松上手,附完整代码示例!

LangChain是一个专为大语言模型设计的开放框架,围绕任务链(Chain)与内存模块(Memory)构建了核心架构。这两大组件是LangChain高效构建复杂语言应用的关键所在,使模型在多任务环境中得以应对任务管理、上下文维护、记忆存储等多种需求。

构建大模型智能应用的时候,往往需要对数据库进行查询,返回结果,如果自己写MCP客户端和Tools工具比较麻烦。如果基于LangChain框架的话,可以简化这种方法。本文就来演示一下,在LangChain框架下,如何使用MCP操作数据库以及如何使用Tools来访问数据库。

我这里假设你已经构建了MCP服务,或者调用的是公共的MCP服务。使用LangChain访问MCP来调用工具,现阶段主要是使用模型上下文协议(MCP)适配器来实现的。MCP适配器用于连接多个 MCP 服务器并加载 LangChain 兼容资源的客户端。此模块提供 MultiServerMCPClient 类,用于管理与多个 MCP 服务器的连接,并从中加载工具、提示和资源。

要使用MultiServerMCPClient需要先安装langchain_mcp_adapters模块:

pip install langchain-mcp-adapters -i https://pypi.tuna.tsinghua.edu.cn/simple # 使用清华源会提升速度

另一个重要的模块是langgraph.prebuilt。这个模块随langgraph模块的安装会自动安装。

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

这个模块是 LangGraph 库的核心组成部分,提供了一系列预构建的组件和工具,旨在简化复杂 AI 代理和工作流的开发过程。LangGraph 是 LangChain 生态的扩展框架,专注于构建有状态、多步骤的 AI 系统,通过状态图(StateGraph)管理节点和边,支持动态路由、循环和状态管理。该模块通过封装常见的代理逻辑、工具执行和状态管理功能,显著降低了开发者的编码负担,适合快速原型化和生产级应用。这里我们主要使用他的一个函数create_react_agent()。这个函数是用于构建基于 ‌ReAct(思考-行动)模式‌ 的智能代理(Agent)的核心函数,其作用是将大语言模型(LLM)与工具调用能力结合,实现动态任务处理。其中ReAct是一种结合推理和行动的代理架构。

使用示例代码如下:

from langchain_mcp_adapters.client import MultiServerMCPClient
# 配置我们自己构建的MCP服务或者公共的MCP地址
client = MultiServerMCPClient(
{
"math": {
"command": "python",
# Make sure to update to the full absolute path to your math_server.py file
"args": ["/path/to/math_server.py"],
"transport": "stdio",
},
"weather": {
# Make sure you start your weather server on port 8000
"url": "https://:8000/mcp",
"transport": "streamable_http",
},
"mcp-server-chart": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@antv/mcp-server-chart"
],
"transport": "stdio",
}
}
)
# 获取所有的工具列表
tools = await client.get_tools()
# 真实调用的时候传入大模型和工具列表构建一个agent
agent = create_react_agent(
model,
tools
)
# 通过invoke来实现工具的调用
result = await agent.ainvoke({
"messages": [...]
})

整体流程就是:

这里我有一个Postgresql数据库表,存储是某市的供地信息,使用MCP查询数据库,并返回结果,代码如下:

# 调用公开MCP工具----------------------
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_openai_tools_agent
from langchain_core.messages import HumanMessage
from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
model = ChatOpenAI(
streaming=True,
model='deepseek-chat',
openai_api_key=<你的API KEY>,
openai_api_base='https://api.deepseek.com',
max_tokens=1024,
temperature=0.7
)
async def mcp_main(query:str):
# 加载 MCP 配置
client = MultiServerMCPClient(
{
"postgres": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://postgres:123456@localhost:5432/gtyzt"
],
"transport": "stdio",
}
}
)
tools = await client.get_tools()
agent = create_react_agent(
model,
tools
)
system_prefix = """
你是一个SQL语句生成专家。根据用户的问题和提供的数据库表结构信息,生成正确的SQL查询语句。
数据库元数据:
{schema}
生成SQL的规则:
1. 只生成SQL语句,不要添加任何解释或说明
2. 使用正确的表名和列名,与提供的结构一致,字段要加上中文别名
3. 确保SQL语法正确,适用于PostgreSQL数据库,geometry类型的字段要用ST_AsText(字段名)来获取
4. 如果有聚合操作,确保使用正确的聚合函数
5. 对于日期类型的条件,使用正确的日期格式
6. 如果需要排序,添加适当的ORDER BY子句
7. 查询结果要去除重复结果
"""
schema = """
"table_name": "gd",
"description": "供地数据表",
"columns":[
{"column_name": "ogc_fid","chinese_name": "标识码","data_type": "int"},
{"column_name": "wkb_geometry","chinese_name": "地理坐标信息","data_type": "geometry"},
{"column_name": "shape_len","chinese_name": "图形长度","data_type": "double"},
{"column_name": "shape_area","chinese_name": "图形面积","data_type": "double"},
{"column_name": "city","chinese_name": "大市","data_type": "varchar"},
{"column_name": "town","chinese_name": "区县(只到区县)","data_type": "varchar"},
{"column_name": "tdzl","chinese_name": "土地坐落(包括乡镇街道,道路)","data_type": "varchar"},
{"column_name": "xzqdm","chinese_name": "行政区代码","data_type": "varchar"},
{"column_name": "tdyt","chinese_name": "土地用途","data_type": "varchar"},
{"column_name": "crnx","chinese_name": "出让年限","data_type": "varchar"},
{"column_name": "gyfs","chinese_name": "供应方式","data_type": "varchar"},
]
"""
# 执行任务:访问网页并总结内容
result = await agent.ainvoke({
"messages": [
{"role":"system", "content":system_prefix.format(schema=schema)},
{"role":"user", "content":query}
]
})
print(result["messages"][-1].content)
return result["messages"][-1].content
if __name__ == "__main__":
query = "告诉我某市土地用途类型"
asyncio.run(mcp_main(query))

返回结果如下,可以看到结论清晰,并且如果数据库比较大的话,我实测速度上比我们自己让大模型去生成SQL,再执行是更快的,效率也更高。

除了使用MCP,还有一种办法就是使用Tools来访问数据库,我们自己构建一个查询数据库的工具来进行查询并返回,本质上也和前面的MCP一样,构建了一个工具,一次性的返回查询结果。自己编写工具的最大好处就是比较可控。这里我使用langchain_community模块的create_sql_agent()函数。

首先,我们需要创建一个数据库连接;然后我们可以构建提示词,我这里使用了few-shot方法,给出了几个示例,这样的话,有利于提升大模型生成SQL的准确性并且速度更快,注意在使用few-shot的时候需要使用embedding模型,可以自己本地部署,也可以使用网上的模型。接下来根据提示词和大模型,调用create_sql_agent函数,构建一个sql代理agent。通过agent的invoke方法执行查询,并把这个流程封装成一个函数,作为tool暴露出来,供程序调用。主函数中,现在大模型上绑定这个tools工具,获取包含工具调用的初始响应,通过工具的invoke函数获取数据库查询结果,最后把结果传给大模型,得到最终的输出。

# text2sql工具,并以tool格式封装,查询结果可以通过大模型返回
from langchain.chains import create_sql_query_chain
from langchain_experimental.sql import SQLDatabaseChain
from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI
db = SQLDatabase.from_uri("postgresql://postgres:123456@localhost:5432/gtyzt")
model = ChatOpenAI(
streaming=True,
model='deepseek-chat',
openai_api_key=<你的APK KEY>,
openai_api_base='https://api.deepseek.com',
max_tokens=1024,
temperature=0.7
)
from langchain_community.agent_toolkits import create_sql_agent
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
examples = [
{"input": "某某区供地地块数量是多少?", "query": "SELECT COUNT(*) FROM gd WHERE town like '某某区%';"},
{"input": "查询某某区供地信息","query":"""
SELECT DISTINCT
ogc_fid AS "标识码",
shape_len AS "图形长度",
shape_area AS "图形面积",
city AS "大市",
town AS "区县(只到区县)",
tdzl AS "土地坐落(包括乡镇街道,道路)",
xzqdm AS "行政区代码",
tdyt AS "土地用途",
crnx AS "出让年限",
gyfs AS "供应方式"
FROM gd
WHERE town like '某某区%'
"""}
]
embeddings = OllamaEmbeddings(model="bge-m3:567m")
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
embeddings,
FAISS,
k=5,
input_keys=["input"],
)
from langchain_core.prompts import (
ChatPromptTemplate,
FewShotPromptTemplate,
MessagesPlaceholder,
PromptTemplate,
SystemMessagePromptTemplate,
)
system_prefix = """
你是一个SQL语句生成专家。根据用户的问题和提供的数据库表结构信息,生成正确的SQL查询语句。
数据库元数据:
{schema}
生成SQL的规则:
1. 只生成SQL语句,不要添加任何解释或说明
2. 使用正确的表名和列名,与提供的结构一致,字段要加上中文别名
3. 确保SQL语法正确,适用于PostgreSQL数据库,geometry类型的字段要用ST_AsText(字段名)来获取
4. 如果有聚合操作,确保使用正确的聚合函数
5. 对于日期类型的条件,使用正确的日期格式
6. 如果需要排序,添加适当的ORDER BY子句
7. 查询结果要去除重复结果
"""
schema = """
"table_name": "gd",
"description": "供地数据表",
"columns":[
{"column_name": "ogc_fid","chinese_name": "标识码","data_type": "int"},
{"column_name": "wkb_geometry","chinese_name": "地理坐标信息","data_type": "geometry"},
{"column_name": "shape_len","chinese_name": "图形长度","data_type": "double"},
{"column_name": "shape_area","chinese_name": "图形面积","data_type": "double"},
{"column_name": "city","chinese_name": "大市","data_type": "varchar"},
{"column_name": "town","chinese_name": "区县(只到区县)","data_type": "varchar"},
{"column_name": "tdzl","chinese_name": "土地坐落(包括乡镇街道,道路)","data_type": "varchar"},
{"column_name": "xzqdm","chinese_name": "行政区代码","data_type": "varchar"},
{"column_name": "tdyt","chinese_name": "土地用途","data_type": "varchar"},
{"column_name": "crnx","chinese_name": "出让年限","data_type": "varchar"},
{"column_name": "gyfs","chinese_name": "供应方式","data_type": "varchar"}
]
"""
few_shot_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=PromptTemplate.from_template(
"User input: {input}\nSQL query: {query}"
),
input_variables=["input", "schema"],
prefix=system_prefix,
suffix="",
)
full_prompt = ChatPromptTemplate.from_messages(
[
SystemMessagePromptTemplate(prompt=few_shot_prompt),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad"),
]
)
agent = create_sql_agent(
llm=model,
db=db,
prompt=full_prompt,
verbose=True,
agent_type="openai-tools",
)
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langchain_core.messages import ToolMessage
from langchain_core.messages import AIMessage
import os
import json
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
@tool(description="查询数据库")
def query_db(query: str) -> str:
"""
查询数据库
Args:
query: 用户问题
"""
result = agent.invoke({"input": query, "schema": schema})
return result
@tool(description="查询地理位置信息")
def query_map(query: str) -> str:
"""
查询地理位置信息
Args:
query: 用户问题
"""
result = agent.invoke({"input": query, "schema": schema})
print(result)
return result
if __name__ == "__main__":
llm_with_tools = model.bind_tools([query_db])
query = "告诉我某市土地用途类型"
messages = [HumanMessage(query)]
# 获取包含工具调用的初始响应
ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)
# 执行工具并获取结果
if ai_msg.tool_calls:
tool_result = query_db.invoke(ai_msg.tool_calls[0])
json_str = tool_result.content
json_obj = json.loads(json_str)
tool_msg = ToolMessage(
content=json_obj['output'],
tool_call_id=ai_msg.tool_calls[0]['id']
)
messages.append(tool_msg)
# 流式输出最终响应
for chunk in llm_with_tools.stream(messages):
if hasattr(chunk, 'content') and chunk.content:
print(chunk.content, end="", flush=True)

执行结果如下:

Finished chain.

根据数据库查询结果,某市的土地用途类型非常丰富,主要包括以下几大类:

🏭 工业用地

  • 一类工业用地

  • 二类工业用地

  • 三类工业用地

🏢 商业服务业用地

  • 商务金融用地

  • 零售商业用地

  • 旅馆用地

  • 其他商服用地

  • 其他商业服务业用地

… …

还有一种方法就是通过大模型生成SQL,再执行SQL。这种方法其实也是比较好的,定制化比较好,而且对于需要直接返回数据结果而不希望经过大模型“提炼”与“总结”的场景来说就比较有用了,因为不管是MCP还是tools工具调用,查询的结果都会经过大模型再过一边,得到的是比较“人性化”的返回结果,但如果这个接口就是需要返回某种格式的原始结果,那么用这种方式就会比较好了。

def generate_sql(query):
# 使用 invoke 方法调用链
input_data = {
"input": query,
"schema": schema
}
result = chain.invoke(input_data)
result = result.replace("```sql", "")
result = result.replace("```", "")
print(result)
return result
import psycopg2
import pandas as pd
def execute_query(sql):
try:
conn = psycopg2.connect(
dbname="gtyzt",
user="postgres",
password="123456",
host="localhost",  # 例如'localhost'或者你的数据库服务器IP地址
port="5432"   # PostgreSQL默认端口是5432
)
df = pd.read_sql(sql, conn)
conn.close()
return df
except Exception as e:
print(f"查询出错: {e}")
return None
def query_map(query:str) -> str:
'''
查询地图
'''
sql = generate_sql(query)
result = execute_query(sql)
return result.to_json(force_ascii=False,orient="records")
if __name__ == "__main__":
sql = generate_sql("查询某区供地信息")
result = execute_query(sql)
print(result.head(10).to_json(force_ascii=False,orient="records"))

通过这三种方式,基本可以完成基于大模型对数据库进行访问和查询了。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

MCP 实践 — 构建 text2sql 工具 MCP(模型上下文协议)是当今的热门词汇。使用 MCP,你可以将 LLM 与各种外部工具连接起来。LLM 使用外部工具(换句话说,函数调用)并不新鲜。那么,为什么它如此流行呢?因为,顾名思义,MCP 提供了统一的函数调用协议。LLM 的函数调用方式有很多,但使用一种统一的函数调用方法可以显著降低代码复杂度,并顺利集成不同的框架和工具。在这篇博客中,我将引导您了解如何创建一个与 MongoDB 集成的简单工具,并将该工具与 Claude 桌面一起使用作为客户端。 阅读详情

相关推荐

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档)

本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。

招风的黑耳优快云 148

<工具 Claude Desktop> 配置 MCP server 连接本地 SQLite, 本机文件夹(目录) 网络驱动器 Windows 11 系统

MCP:Claude Model Context Protocol 暂定义为 模型几段翻译:“今天,我们开源了 Model Context Protocol(MCP),这是一个将人工智能助手与数据存储系统(包括内容库、业务工具和开发环境)连接的新标准。其目的是帮助前沿模型生成更好、更相关的响应。“MCP 解决了这个挑战(模型与数据隔离)。它提供了一种通用的开放标准,用于将 AI 系统与数据源连接,取代了分散的集成,使用单一协议。结果是为 AI 系统提供所需数据的方式更简单、更可靠。

davenian的博客 1万+

DRM驱动代码分析:展频 跳频

DRM驱动代码分析:展频 跳频

yuuu_cheer的博客 2679

LangChain 与 MySQL 数据库整合

本文介绍了如何将LangChain与MySQL数据库整合,构建完整的"自然语言→SQL→查询→回答"流程。主要内容包括: 环境配置 安装PyMySQL驱动 初始化Qwen LLM模型 配置MySQL数据库连接 核心流程 自定义create_sql_query_chain函数生成SQL 使用Runnable组合执行SQL并获取结果 将查询结果转化为自然语言回答 实现特点 保留SQL生成和执行过程的透明度 支持灵活扩展和定制 提供完整的代码示例 注意事项 确保PyMySQL正确安装 检查数据

feffsdsfdsfd的博客 1165

Avellaneda & Stoikov模型实战解析:如何动态调整做市策略参数

本文深入解析Avellaneda & Stoikov模型在动态调整做市策略参数中的应用,重点探讨库存状态、剩余时间、风险系数和订单深度等核心参数的实战技巧。通过加密货币市场的实际案例,展示如何根据市场波动和流动性动态调整参数,提升做市策略的盈利能力和风险控制水平。

weixin_29070861的博客 202

如何在SpringBoot中实现AI 流式输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1481

MCP机制简单入门

MCP机制快速入门,深入浅出

Wanzi_biulala的博客 947

从入门到精通|Yalmip+Cplex在电力系统中的应用(Matlab代码实现)

​ 火电成本包括运行成本、碳捕集成本,其中火电运行成本由运行维护成 本和发电煤耗成本构成,发电煤耗与其出力关系: ,F 为机组煤耗量(kg/h),P 为机组出力/MW;运行维护成本按照 0.5 倍煤耗成本考虑,碳捕集成本取决于碳排放量及碳捕集单价,火电机组相关参数如附表 1 所示,电煤价格为 700 元/t ​

weixin_46039719的博客 1552

收藏必备:LangChain大模型应用开发:MCP与Tools数据库访问全攻略

本文详细介绍了LangChain框架下三种数据库访问方法:通过MCP适配器连接数据库、使用Tools工具封装查询功能,以及直接让大模型生成SQL语句。文章提供了完整的代码示例和实际应用场景,分析了每种方法的优势和适用情况。对于开发者而言,可根据需求选择适合的数据库访问方式,提高大模型应用开发效率,特别是在处理复杂数据库查询任务时,LangChain框架能显著简化开发流程。

datian1234的博客 719

ATS Request中的PASID的作用是什么

摘要: PASID(进程地址空间标识符)是PCIe ATS(地址转换服务)中的关键组件,用于标识不同进程或虚拟机的地址空间。其主要作用包括:1)支持多进程共享设备时隔离地址空间;2)实现共享虚拟地址(SVA),允许用户态程序直接访问设备;3)提升虚拟化性能(如SIOV),通过PASID区分虚拟机请求;4)增强安全性,基于PASID限制设备内存访问权限。PASID通过20位标识符在TLP前缀中传递,与IOMMU协作完成地址转换与缓存,适用于高性能计算、AI及虚拟化场景,但依赖硬件支持和软件适配。

元直的博客 1562

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8415

向量数据库选哪家?free-ai-tools廉价Vector DB托管与自托管方案对比(ChromaDB、Qdrant、Pinecone)

正在搭建 RAG 应用却不知道向量数据库选哪家?开源项目 **free-ai-tools** 是一份持续更新的免费与低成本 AI 工具清单,专门整理了 9 款廉价 Vector DB 托管服务和 5 款自托管方案,并对 ChromaDB、Qdrant、Pinecone 等主流向量数据库做了免费额度与价格对比。本文带你快速看懂各方案差异,按预算和项目阶段选出最合适的向量数据库。 ## 向量数据库为

gitblog_01149的博客 99

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

easy-vibe 技术精读:Claude Agent SDK 从入门到企业级 Agent 流水线实战

> 本文是 Datawhale easy-vibe 项目 [Claude Agent SDK 章节](https://link.gitcode.com/i/eeae1a879c667cc45226898e57a7a013) 的深度扩展。全文围绕该文档的完整知识骨架展开:先厘清 Agent SDK 与基础 SDK、与主流 Agent 框架的本质区别,再逐步掌握安装认证、两种编程模式、内置工具、Hoo

gitblog_01416的博客 629

论文阅读:ICLR 2026 Breaking and Fixing Defenses Against Control-Flow Hijacking in Multi-Agent Systems

该论文首先系统阐述了控制流劫持攻击的核心机理。此类攻击通过操纵多智能体系统的编排机制,诱导系统执行非安全操作,进而实现敏感信息窃取。攻击者将恶意指令伪装成环境错误信息,借助可信代理传递至系统编排器,利用"困惑副手"漏洞绕过传统安全防线。该论文指出,现有防御方案如LlamaFirewall所依赖的对齐检查机制存在根本性局限——安全目标与功能需求之间存在不可调和的内在冲突。该论文的核心贡献体现在攻防两个维度。

CSPhD-winston的博客 493

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring AI Alibaba 1.0 GA 正式发布,开启 Java 智能体开发新时代!-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓2025 年是 AI 智能体快速爆发的一年,从单智能体、多智能体到通用智能体的多种不同构建模式持续涌现出来,智能体开发也逐步从概念、Demo 开始走向生产落地,应用范围也从编程助手等几个少数领域,逐步拓展到企业内部业务、生活工作助手等多个领域。

求知若渴、虚心若愚 578

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

从透明化解析到精准生成:聚焦Focus_MCP_SQL的Text2SQL创新实践

Focus_MCP_SQL的价值不仅在于技术实现,更在于其对工具本质的思考——技术的终极目标应是增强而非替代人的判断。通过将生成过程拆解为“人可理解的关键词”与“机器精确执行的SQL”,该项目在效率与可控性之间找到了平衡点,为LLM落地数据库交互场景提供了新的范式。对于寻求低成本、高透明性解决方案的团队,这或许是一个值得探索的起点。传统Text2SQL技术试图用自然语言直接生成SQL查询,然而大模型的黑箱特性、高昂成本及不可控的幻觉问题,使得这一目标长期陷入“理想丰满,现实骨感”的困境。

clarance2015的博客 1154

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 457

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 410

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 301

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 327

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 370

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 250

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 152
上一篇: 大模型开发必看:从传统RAG到智能体RAG,一文掌握AI应用性能提升10倍的秘密武器!
下一篇: “我的AI是个健忘症?“三步打造会记住一切的智能助手:RAG→agentic RAG→agent memory
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值