wireshark抓包查看langchain的ChatOpenAI接口发送和接收的数据

1. 引入

当我们用vllm部署一个大模型,就可以调用langchain的ChatOpenAI()接口来访问大模型(具体过程参考[1]),这也是langchain的Agent的基础接口使用方式。

那么问题来了,这个接口是使用哪种方式与大模型进行通信的呢?

2. 抓包过程

我们可以通过抓包这个过程来看一看:

  1. 首先,启动wireshark

  2. 运行如下python代码,与大模型进行通信

from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage

llm = ChatOpenAI(
    streaming=True,
    verbose=True,
    openai_api_key="none",
    openai_api_base='http://10.11.12.13:4000', 
    model_name="aaa-gpt" 
)
output = llm([HumanMessage(content="你好")])
print(output.content) # 你好!很高兴为你提供帮助。有什么问题或需要什么信息呢?
  1. 使用wireshark搜索目的地址为大模型服务IP的内容

搜索:ip.dst eq 10.11.12.13 and tcp
在这里插入图片描述
可以看到,ChatOpenAI接口,往目的地址,POST了一个HTTP请求到/chat/completions,并收到回复。

要知道具体POST了什么内容,可以鼠标右键,选“追踪流”:
在这里插入图片描述
就能看到
(1)接口发送的内容如下

POST /chat/completions HTTP/1.1
Host: 10.11.12.13:4000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Accept: application/json
Content-Type: application/json
User-Agent: OpenAI/Python 1.51.2
X-Stainless-Lang: python
X-Stainless-Package-Version: 1.51.2
X-Stainless-OS: Windows
X-Stainless-Arch: other:amd64
X-Stainless-Runtime: CPython
X-Stainless-Runtime-Version: 3.12.7
Authorization: Bearer none
X-Stainless-Async: false
x-stainless-retry-count: 0
Content-Length: 122

{"messages": [{"content": "\u4f60\u597d", "role": "user"}], "model": "aa-gpt", "n": 1, "stream": true, "temperature": 0.7}

这里有两个关键点:

  • \u4f60\u597d:是中文“你好”的unicode
  • Authorization: Bearer none,这里的none就是python代码中的openai_api_key

可以看到,openai_api_key,是被放在POST请求的header中发送的。

(2)接收/大模型回复的内容如下

HTTP/1.1 200 OK
date: Tue, 15 Oct 2024 06:39:28 GMT
server: uvicorn
x-litellm-call-id: 1111c2cf-011c-4111-b110-c31111113e11
x-litellm-model-id: 15111111da111111c2618be6ed1111113a15111111db0101111114c111111725
x-litellm-version: 1.43.4
x-litellm-key-tpm-limit: None
x-litellm-key-rpm-limit: None
llm_provider-date: Tue, 15 Oct 2024 06:39:28 GMT
llm_provider-server: uvicorn
llm_provider-content-type: text/event-stream; charset=utf-8
llm_provider-transfer-encoding: chunked
content-type: text/event-stream; charset=utf-8
transfer-encoding: chunked

c5
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......","role":"assistant"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b5
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"........."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b5
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"........."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b2
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"......"}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
af
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":"..."}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
ac
data: {"id":"chat-111111111111111111111111111","choices":[{"index":0,"delta":{"content":""}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
b7
data: {"id":"chat-111111111111111111111111111","choices":[{"finish_reason":"stop","index":0,"delta":{}}],"created":1728974369,"model":"tq-gpt","object":"chat.completion.chunk"}
e
data: [DONE]
0

3. 测试POST

把上面分析得到的内容,POST的header配置,写为如下的POST请求:

curl http://10.11.12.13:4000/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer none" \
    -d '{"model": "aa-gpt","messages": [{"role":"user","content":"你好"}]}'

到linux上测试,得到的结果也和上面接口的一致。

4. 总结

通过wireshark抓包,目的IP地址过滤,追踪流,就能看到langchain的ChatOpenAI发送的POST请求细节内容,并能依此构造一个POST请求来模拟该接口的通信。

参考

  1. https://blog.csdn.net/ybdesire/article/details/140691972

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…

arcgis坐标系问题

2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据(影像图),如果打开80的数据则会投影错误,出现较大偏差。 解决方案:80数据框打开80数据,2000数据库打开2000数据。

0-1规划的求解

实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的:学会使用Matlab编程实现求解0-1规划。 实验内容:1.学习使用Matlab定义子函数的命令function; 2.编程求解0-1型整数规划的枚举法或隐枚举法。 例1:求…

RNN与Self-Attention

文章目录 1. SimpleRNN1.1 h t h_t ht​计算1.2 激活函数 2. SimpleRNNSelf-Attention2.1 状态更新2.2 权重 α α α 1. SimpleRNN 学习视频:https://www.youtube.com/watch?vCc4ENs6BHQw&t0s 对于时序数据,输入输出都不固定,需要ma…

R-CNN,Fast R-CNN,

R-CNN R-CNN可以说是利用深度学习进行目标检测的开山之作 RCNN算法流程可分为4个步骤 - 一张图像生成1K~2K个候选区域(使用Selective Search方法) - 对每个候选区域,使用深度网络提取特征 - 特征送入每一类的SVM 分类器,判别是否属于该类 - 使用回归器…

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…

人工智能证书合集

本文将对目前市面上主流官方机构颁发的人工智能证书进行整理和介绍,由于整理的证书较多,本文共一万八千多字,请根据自己的考证需求阅读对应部分的内容,希望本文对人工智能行业的从业人员和计划从事人工智能相关岗位工作的人员有所…

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考(spring-boot-helloWorld-2.x)示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf,实际以最新更新的手册为准。 2.本文…

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的,得自己一步步搭建。 这次讲如何发送图片消息,选择图片,显示图片消息。 还是有点难度的,好好看,好好学。 一、思路: 选择图片用:photoVie…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业,每天需要处理大量纸质文件,从合同到判决书,手动录入不仅费时,还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台,通过先进的光学字符识别(OCR)技术,将…

详解ReentrantLock--三种加锁方式

目录 介绍AQS: 直观方式解释加锁的流程: Node是什么:它里面有什么属性呢 图解队列的排队过程: 源码分析三种加锁流程: 我们先讲解一下非公平锁的加锁流程: Lock()方式加锁: 在源码里对于Lock()的解…

【教程】Git 标准工作流

目录 前言建仓,拉仓,关联仓库修改代码更新本地仓库,并解决冲突提交代码,合入代码其他常用 Git 工作流删除本地仓库和远程仓库中的文件日志打印commit 相关 前言 Git 是日常开发中常用的版本控制工具,配合代码托管仓库…

Postman断言与依赖接口测试详解!

在接口测试中,断言是不可或缺的一环。它不仅能够自动判断业务逻辑的正确性,还能确保接口的实际功能实现符合预期。Postman作为一款强大的接口测试工具,不仅支持发送HTTP请求和接收响应,还提供了丰富的断言功能,帮助测试…

百度SEO与SEM到底有什么区别?福建企业老板们需要了解的关键点【百度SEO专家】

大家好,我是林汉文,一名百度SEO专家。最近在与一些企业Boss沟通时,我发现很多人对SEO与SEM的区别并不清楚,有时甚至会混为一谈。SEO和SEM确实都是搜索引擎营销的重要手段,但它们在实现方式、效果和适用场景上都有着明显…

JavaFX WebView + Vue初始化加载数据解决方案

一般WebView加载Vue时,我们需要注入一些数据,而我发现当WebView加载完毕再注入脚本,Vue是无法正确识别注入的脚本函数,也无法正确获取所要注入的数据,因此可以采用以下方法解决Vue无法正确加载数据问题 1、配置WebView…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04, 本文安装的版本: cuda_11.1.0;cuDNN-8.2.1;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

传输层协议TCP详解(上篇)

目录 一. TCP协议 1.1 什么是TCP协议 1.2 TCP为什么叫传输控制协议 二. TCP协议段格式 三. 确认应答(ACK)机制 3.1 什么是确认应答机制 3.2 推导确认应答机制 四. 超时重传机制 五. 连接管理机制 5.1 六位标志位 5.2 如何…

wps宏代码学习

推荐学习视频:https://space.bilibili.com/363834767/channel/collectiondetail?sid1139008&spm_id_from333.788.0.0 打开宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮,会让细节别的更明显。膨胀也是形态学中的一种操作,在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作,可以构成开闭操作。 开操作是先腐蚀…

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法

一、项目背景 客户新系统上线,因为行业网络安全要求,需要做等保测评, 通过第三方漏扫工具扫描系统,漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞,具体结果如下: 1、ZooKeeper 未授权访问【…