首页 > 其他分享 >langchain接入星火大模型(其他模型也可以参考)

langchain接入星火大模型(其他模型也可以参考)

时间:2023-08-15 17:22:30浏览次数:42  
标签:url 模型 langchain ws import 星火 data self def

首先来说LangChain是什么?不了解的可以点击下面的链接来查看下。

LangChain入门指南_故里_的博客-CSDN博客

然后在介绍一下星火认知大模型相关:
讯飞星火认知大模型
感兴趣的小伙伴可以了解一下,国内比较成熟的类GPT(我自己定义的,也不知道对不对)模型。

说一下大概需求,首先我是要用到功能是文章摘要,之前接入的是OpenAI的api接口(langchain中已经封装好了相关内容),其实只对模型的好用程度来说OpenAI确实要相较于市面上其他的模型都要更智能一点,哪怕是对中文来说,而且因为是自己调试,都没用到GPT-4,仅是3.5系列模型都更加优秀一些。但是对于开发者来说尤其是在公司进行开发还是有一些弊端的。首先是收费,对于企业合作不知道收费具体怎么样,但对开发者自己来说确实收费还是比较高的(而且我一直也没搞懂这个收费是个怎么个收法,虽然他们说是按照token,但是总感觉有时候收费少了有时候收费多了)。其次是网络环境,比较优秀的解法是外部亚马逊服务器部署相关服务。最后是token数量,这个是比较硬伤的东西。

于是国内的大模型就成了我较好的选择,我的需求不仅仅是简单的问答,而是需要结合prompt来使用,同时因为我的输入内容比较大需要借助langchain内部的map_reduce来对我的整个提问流程进行一个整合,所以进行了星火Spark 接入langchain,其余模型也可以参考这个模板进行函数替换,之后会尝试自己部署模型调试以及优化,希望有喜欢机器学习的小伙伴一起成长。话不多说,上代码。

import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
import ssl
import websocket
import langchain
import logging
from config import SPARK_APPID, SPARK_API_KEY, SPARK_API_SECRET
from urllib.parse import urlparse
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
from typing import Optional, List, Dict, Mapping, Any
from langchain.llms.base import LLM
from langchain.cache import InMemoryCache
 
logging.basicConfig(level=logging.INFO)
# 启动llm的缓存
langchain.llm_cache = InMemoryCache()
result_list = []
 
 
def _construct_query(prompt, temperature, max_tokens):
    data = {
        "header": {
            "app_id": SPARK_APPID,
            "uid": "1234"
        },
        "parameter": {
            "chat": {
                "domain": "general",
                "random_threshold": temperature,
                "max_tokens": max_tokens,
                "auditing": "default"
            }
        },
        "payload": {
            "message": {
                "text": [
                    {"role": "user", "content": prompt}
                ]
            }
        }
    }
    return data
 
 
def _run(ws, *args):
    data = json.dumps(
        _construct_query(prompt=ws.question, temperature=ws.temperature, max_tokens=ws.max_tokens))
    # print (data)
    ws.send(data)
 
 
def on_error(ws, error):
    print("error:", error)
 
 
def on_close(ws):
    print("closed...")
 
 
def on_open(ws):
    thread.start_new_thread(_run, (ws,))
 
 
def on_message(ws, message):
    data = json.loads(message)
    code = data['header']['code']
    # print(data)
    if code != 0:
        print(f'请求错误: {code}, {data}')
        ws.close()
    else:
        choices = data["payload"]["choices"]
        status = choices["status"]
        content = choices["text"][0]["content"]
        result_list.append(content)
        if status == 2:
            ws.close()
            setattr(ws, "content", "".join(result_list))
            print(result_list)
            result_list.clear()
 
 
class Spark(LLM):
    '''
    根据源码解析在通过LLMS包装的时候主要重构两个部分的代码
    _call 模型调用主要逻辑,输入问题,输出模型相应结果
    _identifying_params 返回模型描述信息,通常返回一个字典,字典中包括模型的主要参数
    '''
 
    gpt_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # spark官方模型提供api接口
    host = urlparse(gpt_url).netloc  # host目标机器解析
    path = urlparse(gpt_url).path  # 路径目标解析
    max_tokens = 1024
    temperature = 0.5
 
    # ws = websocket.WebSocketApp(url='')
 
    @property
    def _llm_type(self) -> str:
        # 模型简介
        return "Spark"
 
    def _get_url(self):
        # 获取请求路径
        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"
 
        signature_sha = hmac.new(SPARK_API_SECRET.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="{SPARK_API_KEY}", 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 = self.gpt_url + '?' + urlencode(v)
        return url
 
    def _post(self, prompt):
        #模型请求响应
        websocket.enableTrace(False)
        wsUrl = self._get_url()
        ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error,
                                    on_close=on_close, on_open=on_open)
        ws.question = prompt
        setattr(ws, "temperature", self.temperature)
        setattr(ws, "max_tokens", self.max_tokens)
        ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
        return ws.content if hasattr(ws, "content") else ""
 
    def _call(self, prompt: str,
              stop: Optional[List[str]] = None) -> str:
        # 启动关键的函数
        content = self._post(prompt)
        # content = "这是一个测试"
        return content
 
    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """
        Get the identifying parameters.
        """
        _param_dict = {
            "url": self.gpt_url
        }
        return _param_dict
 
 
if __name__ == "__main__":
    llm = Spark(temperature=0.9)
    # data =json.dumps(llm._construct_query(prompt="你好啊", temperature=llm.temperature, max_tokens=llm.max_tokens))
    # print (data)
    # print (type(data))
    result = llm("你好啊", stop=["you"])
    print(result)

  

标签:url,模型,langchain,ws,import,星火,data,self,def
From: https://www.cnblogs.com/Jicc-J/p/17631887.html

相关文章

  • 大模型材料收集
    大模型材料收集360安全大模型推动大模型B端落地,360想怎么做?企业安全智控系统安全问答安全运营通用大模型数据安全问问题专业知识缺乏成本控制难专业大模型垂直专业性安全合规性使用成本知识确权B端:面向消费者C端:面向商家小米大模型雷军:小米......
  • 小米宣布科技战略升级,新一代折叠屏、仿生机器人、端侧大模型等重磅亮相
    8月14日晚,小米新品发布会在北京国家会议中心举行,小米集团创始人、董事长兼CEO雷军第四次做年度公开演讲,分享了他在过去36年中,几次关键成长的经历和感悟。在发布会上,雷军正式宣布小米科技战略升级,并公布了小米的科技理念:选择对人类文明有长期价值的技术领域,坚持长期持续投入。本次......
  • 大火的扩散模型终于杀到了NLP领域
    从2020年的初出茅庐,到2021年的日趋火热,再到2022年的大放异彩,扩散模型(DiffusionModels)如果还不是特别了解扩散模型的朋友,可以阅读卖萌屋的几篇历史推文《扩散模型在图像生成领域大火,风头超过GAN?》,《年末回顾:2021年AI领域十大研究趋势及必读论文》。扩散模型最早在图像生成领......
  • WAVE SUMMIT2023六大分会场同步开启,飞桨+文心大模型加速区域产业智能化!
    由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVESUMMIT深度学习开发者大会2023将于8月16日重磅来袭!届时上海、广州、深圳、成都、南昌和宁波六大分会场将同步开启!分会汇聚区域产业大咖、科研机构专家、知名学者和技术大牛,通过主题演讲和深度交流等形式......
  • 马尔可夫转换模型研究交通伤亡人数事故时间序列预测|附代码数据
    原文链接:http://tecdat.cn/?p=12227最近我们被客户要求撰写关于马尔可夫转换模型的研究报告,包括一些图形和统计输出。本文描述了R语言中马尔克夫转换模型的分析过程首先,对模拟数据集进行详细建模。接下来,将马尔可夫转换模型拟合到具有离散响应变量的真实数据集。用于验证对这些......
  • 一文详解Apipost数据模型功能
    在Apipost数据模型中用户可以预先创建多个数据模型,并在API设计过程中重复利用这些模型来构建API创建数据模型在左侧导航点击「数据模型」-「新建数据模型」在右侧工作台配置数据模型参数 引入数据模型在API设计预定义响应期望下点击引用数据模型,并选择需要导入的数据模型......
  • 【产品人卫朋】专栏及配套资料更新:华为流程体系、产品经理、IPD与BLM模型
    目录前言01华为流程体系专栏02产品经理进阶专栏03华为战略方法论专栏04IPD进阶100例专栏作者介绍前言截止目前,本号已上线四大干货专栏,内容涉及:01华为流程体系(图文+视频);02硬件产品经理(图文+视频);03BLM战略方法论(图文+视频);04集成产品开发IPD体系(图文)。四大专栏具体内容......
  • 《yolov5 如果针对一个模型权重反复增加样本训练》
    如果你已经有了一个YOLOv5的模型权重,要使用新的图像数据进行优化,您可以使用以下方法来获得新的模型权重:1.重新训练模型:将新的图像数据与原有的图像数据一起作为训练数据,以更快的速度重新训练模型。2.增量式学习:在原有的模型权重的基础上,通过训练新的图像数据来进行更......
  • 大模型时代的模型运维与部署:LLMops
    来源:https://blog.csdn.net/sinat_26917383/article/details/1315383341LLMOps介绍1.1关联定义术语LLMOps代表大型语言模型运维。它的简短定义是LLMOps是LLM的MLOps。这意味着LLMOps是一组工具和最佳实践,用于管理LLM支持的应用程序的生命周期,包括开发、部署和维护......
  • 最流行的开源 LLM (大语言模型)整理
    本文对国内外公司、科研机构等组织开源的LLM进行了全面的整理。LargeLanguageModel(LLM)即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。所谓"语言模型",就是只用来处理语言文字(或者符号体系)的AI模......