#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File : SparkApi.py
@Time : 2023/10/18 11:01:37
@Author : CrissChan
@Version : 1.0
@Site : https://blog.csdn.net/crisschan
@Desc : 调取讯飞Spark的类,为了能够后续可以实现Chain prompts,修改了返回的content内容的处理。
这样如果返回是一个list,那么我们就把它拿出来
'''
import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
import websocket # 使用websocket_client
answer = ""
class Ws_Param(object):
# 初始化
def __init__(self, APPID, APIKey, APISecret, Spark_url):
self.APPID = APPID
self.APIKey = APIKey
self.APISecret = APISecret
self.host = urlparse(Spark_url).netloc
self.path = urlparse(Spark_url).path
self.Spark_url = Spark_url
# 生成url
def create_url(self):
# 生成RFC1123格式的时间戳
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
# 拼接字符串
signature_origin = "host: " + self.host + "\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET " + self.path + " HTTP/1.1"
# 进行hmac-sha256进行加密
signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
digestmod=hashlib.sha256).digest()
signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
# 将请求的鉴权参数组合为字典
v = {
"authorization": authorization,
"date": date,
"host": self.host
}
# 拼接鉴权参数,生成url
url = self.Spark_url + '?' + urlencode(v)
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
return url
# 收到websocket错误的处理
def on_error(ws, error):
print("### error:", error)
# 收到websocket关闭的处理
def on_close(ws,one,two):
print(" ")
# 收到websocket连接建立的处理
def on_open(ws):
thread.start_new_thread(run, (ws,))
def run(ws, *args):
data = json.dumps(gen_params(appid=ws.appid, domain= ws.domain,question=ws.question))
ws.send(data)
# 收到websocket消息的处理
def on_message(ws, message):
# print(message)
data = json.loads(message)
# print(data)
code = data['header']['code']
if code != 0:
print(f'请求错误: {code}, {data}')
ws.close()
else:
choices = data["payload"]["choices"]
status = choices["status"]
content = choices["text"][0]["content"]
print(content,end ="")
# 尝试找到可以转成python对象的list结构
# print(content)
global answer
answer += content
#print(1)
if status == 2:
ws.close()
def gen_params(appid, domain,question):
"""
通过appid和用户的提问来生成请参数
"""
data = {
"header": {
"app_id": appid,
"uid": "1234"
},
"parameter": {
"chat": {
"domain": domain,
"random_threshold": 0.5,
"temperature": 0.5,
"max_tokens": 2048,
"auditing": "default"
}
},
"payload": {
"message": {
"text": question
}
}
}
return data
def main(appid, api_key, api_secret, Spark_url,domain, question):
# print("星火:")
wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
# websocket.enableTrace(False)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
ws.appid = appid
ws.question = question
ws.domain = domain
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
为集成LLM到测试平台提供更便捷的方式:为讯飞的LLM星火创建接入LangChain类(全部源代码)
需积分: 0 161 浏览量
更新于2023-11-02
收藏 5KB ZIP 举报
在IT行业中,集成大型语言模型(LLM)到测试平台是一项关键任务,它能帮助开发者高效地验证模型的性能和稳定性。本项目专注于为讯飞的LLM星火(IFLYTEK's LLM Spark)提供一个简洁的接入方式,通过LangChain库实现这一目标。LangChain是一个用于构建和管理自然语言处理管道的Python库,它使得不同组件之间能够无缝协作,简化了复杂系统的构建。
我们来看`SparkApi.py`。这个文件很可能是用来封装与讯飞LLM星火接口交互的代码。在实际应用中,它可能包含了对API的调用,如发送请求以获取模型的预测结果,或者设置参数以定制模型的行为。开发者可能会定义一些函数,比如`send_request`,用于封装HTTP请求,还有可能包含错误处理逻辑,确保在API调用过程中遇到问题时能够正确地反馈和处理。
接下来,`spark_middleware.py`可能是一个中间件模块,它在LangChain管道中起到了承上启下的作用。在自然语言处理系统中,中间件可以用来添加额外的功能,如日志记录、性能监控或数据预处理。这个文件可能包含了一些自定义的中间件类,这些类扩展了LangChain的基础中间件,实现了与讯飞LLM星火对接的特定逻辑。例如,`SparkMiddleware`类可能会在输入数据到达时对其进行预处理,并将处理后的数据传递给模型,然后接收模型的响应并进行后处理,以便适应LangChain的接口。
`iflytek.py`很可能包含了与讯飞相关的特定功能和配置。在这个文件中,开发者可能定义了与讯飞SDK的交互逻辑,包括初始化、认证和调用具体服务的方法。此外,也可能包含了配置参数,如API密钥、服务器地址等,这些都是与讯飞服务连接所必需的。
为了将这些组件整合到一个测试平台上,你需要按照以下步骤操作:
1. **安装依赖**:确保已经安装了LangChain库以及其他必要的依赖,如requests库,用于发送HTTP请求。
2. **理解接口**:仔细阅读`SparkApi.py`,理解如何与讯飞的LLM星火接口进行通信。了解API的调用格式、所需参数以及返回的数据结构。
3. **构建LangChain管道**:在LangChain中,定义一个或多个处理节点,使用`spark_middleware.py`中的中间件,确保它们正确地与`SparkApi.py`中的API接口相结合。
4. **配置和初始化**:在`iflytek.py`中获取必要的配置信息,如API密钥和服务器地址,然后在测试平台启动时进行初始化。
5. **测试**:设计测试用例,通过LangChain管道输入数据,观察模型的输出并评估其性能。根据需要调整参数和中间件以优化模型的表现。
6. **记录和监控**:利用`spark_middleware.py`中的中间件功能,记录测试过程中的关键信息,如响应时间、错误率等,以便于后续分析和优化。
通过这种方式,开发者可以轻松地将讯飞的LLM星火集成到自己的测试环境中,高效地进行模型验证和调优,提高开发效率。记住,每个组件的详细理解和灵活运用是成功的关键。

质问
- 粉丝: 1w+
最新资源
- (源码)基于Python语言的forestpy项目.zip
- 计算机系统结构课程中模拟Tomasulo算法动态调度机制的实验项目-动态指令调度-寄存器重命名-保留站-公共数据总线-乱序执行-分支预测-流水线冲突解决-性能优化分析用于深入理解-.ZIP
- (源码)基于GNU make的C语言编程学习教程.zip
- (源码)基于Node.js的B站动态抽奖自动化脚本.zip
- 从零开始实现视觉SLAM与机器人算法的Python实践教程-包含ORB特征点提取对极几何视觉里程计后端优化三维重建Otsu二值化贝叶斯滤波连通域标记目标跟踪等完整S.zip
- (源码)基于React框架的通用前端模板工程.zip
- Java+MySQL+vuejs健身房管理系统、健身房会员管理系统
- gqy20-SLAIS-62936-1753627358636.zip
- 基于物联网与人工智能技术的智慧办公室综合管理系统-集成环境监测-智能门禁-自动化考勤-会议预约-能耗管理-设备远程控制-数据分析可视化-移动办公应用-多终端协同-云端数据同步-智能.zip
- jdh-algo-JoyDataForge-5912-1753356682062.zip
- java毕业设计,广告管理系统
- 基于DeepSeek-API的AI专业术语智能翻译服务系统-人工智能-机器学习-深度学习-自然语言处理-专业术语库-英汉互译-论文翻译-文档翻译-技术文档-学术研究-科研辅助-精准.zip
- forthespada-Awsome-Courses-19764-1752995359733.zip
- Java图书馆座位管理系统
- 基于SpringSpringMVCMyBatis框架开发的高校学生宿舍综合管理系统-包含宿舍分配-水电费管理-访客登记-报修处理-卫生检查等功能模块-用于高校后勤部门对学生宿舍.zip
- HNU2024春季计算机系统课程配套代码仓库-包含CSAPP教材配套实验代码和课堂实例-用于计算机系统原理教学和实验-汇编语言-C语言-计算机组成原理-操作系统基础-处理器架构-内.zip