langchain调用llm模型

langchain调用llm模型

调用llm api

为了保护api,一般将api信息写在单独的环境变量文件.env中。

# .env文件
API_KEY= ***
MODEL_NAME=gpt-3.5-turbo
BASE_URL= ***

在封装llm时使用dotenv.load_dotenv,它会自动读取项目下的.env(确保项目下有.env),并将其转换为环境变量。

from dotenv import load_dotenvload_dotenv()  # 自动读取.env 
model=os.getenv("OPENAI_MODEL_NAME")
api_key=os.getenv("OPENAI_API_KEY")
base_url=os.getenv("BASE_URL")
# ... 其他你需要的环境变量

封装llm api比较简单,别忘了初始化的时候测试一下连接。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from dotenv import load_dotenv
import os
from typing import Optional, Dict, Any
import asyncio  # 异步IO库class LLMService():def __init__(self):  # 最好别在__init__初始化llmself.llm = Noneasync def initialize(self):load_dotenvself.llm = ChatOpenAI(model=os.getenv("OPENAI_MODEL_NAME"),temperature=0.7,streaming=True,api_key=os.getenv("OPENAI_API_KEY"),base_url=os.getenv("BASE_URL"))try:print("正在测试 API 连接...")response = await self.llm.ainvoke("测试消息")print("API 连接成功!")except Exception as e:print(f"API 连接错误: {str(e)}")raisedef get_llm(self):"""获取LLM实例"""return self.llm

调用api时:

from llm import LLMServiceimport asyncioasync def main():  # 注意,定义的异步io要在异步函数里面调用llm_service = LLMService()# 检查是否初始化if not llm_service.get_llm():  await llm_service.initialize()print(llm_service.get_llm().invoke("你好").content)if __name__ == "__main__":asyncio.run(main())

调用本地模型

用基于transformers的GLM9B举个例子。

from langchain.llms.base import LLM
from typing import Any, List, Optional, Iterator
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
from pydantic import Field
from threading import Thread
import osclass GLM9B(LLM):model_path: str = Field()device_map: str = Field()system_prompt: Optional[str] = Field(default=None)tokenizer: Optional[Any] = Field(default=None)model: Optional[Any] = Field(default=None)def __init__(self,model_path: str = "<YOUR_PATH>",device_map: str = "auto",system_prompt: str = None):super().__init__(model_path=model_path, device_map=device_map)self.model_path = model_pathself.device_map = device_mapself.system_prompt = system_promptself.tokenizer = AutoTokenizer.from_pretrained(self.model_path, trust_remote_code=True)self.model = AutoModelForCausalLM.from_pretrained(self.model_path,torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,trust_remote_code=True,device_map=self.device_map).eval()def _stream(self, prompt: str, stop: Optional[List[str]] = None) -> Iterator[str]:messages = []if self.system_prompt:messages.append({"role": "system", "content": self.system_prompt})messages.append({"role": "user", "content": prompt})inputs = self.tokenizer.apply_chat_template(messages,add_generation_prompt=True,tokenize=True,return_tensors="pt",return_dict=True).to(self.model.device)streamer = TextIteratorStreamer(self.tokenizer, skip_special_tokens=True)gen_kwargs = {"max_length": 25000,"do_sample": True,"top_k": 1,"streamer": streamer}# 在后台线程中运行模型生成thread = Thread(target=self.model.generate, kwargs={**inputs,**gen_kwargs})thread.start()# 从streamer中获取生成的tokensfor text in streamer:yield textdef _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:return "".join(self._stream(prompt, stop))@propertydef _llm_type(self) -> str:return "GLM9B"

调用时:

llm = GLM9B(model_path="<YOUR_PATH>",device_map="auto",system_prompt="你是一个乐于助人的AI助手。")# 流式输出测试
for chunk in llm._stream("你好"):print(chunk, end="", flush=True)

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

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

相关文章

TB1801D 线性驱动 LED 恒流芯片

1、产品概述 TB1801D是一款专为12V灯珠设计的汽车灯专用的低压差恒流芯片&#xff0c;输出电流恒流精度≤3&#xff05;&#xff0c;外围结构简单。TB1801D 内置 130℃过温保护电路&#xff0c;可在各种散热条件下将 LED 灯珠温度控制在 140℃以内。TB1801D 内置 100V 的功率 M…

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…

纯血鸿蒙ArkUI线性布局详解

线性布局说明 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row和Column构建。线性布局是其他布局的基础&#xff0c;其子元素在线性方向上&#xff08;水平方向和垂直方向&#xff09;依次排列。线性布局的排列方向由所选容器组…

Debian-linux运维-docker安装和配置

腾讯云搭建docker官方文档&#xff1a;https://cloud.tencent.com/document/product/213/46000 阿里云安装Docker官方文档&#xff1a;https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance 天翼云常见docker源配置指导&#xff1a;htt…

【网络安全实验室】脚本关实战详情

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血澎湃吗 1.key又又找不到了 点击链接&#xff0c;burp抓包&#xff0c;发送到重放模块&#xff0c;点击go 得到key 2.快速口算 python3脚本 得到key 3.这个题目是空的 试了一圈最后发现是 4.怎么就是不弹出key呢…

极品飞车6的游戏手柄设置

极品飞车&#xff0c;既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速&#xff0c;也可以使用游戏手柄来操作车辆的运行。需要注意的是&#xff0c;极品飞车虽然支持手柄&#xff0c;但是仅支持常见的北通、罗技还有部分Xbox系列的手柄&#xff0c;至于其他的PS4手…

安科瑞防孤岛保护装置助力光储充系统安全运行

安科瑞 吕梦怡 ​1.孤岛效应是指在电网供电系统中出现的一种异常情况。 当公共电网因故障停电或者其他原因断电时&#xff0c;原本接入电网的分布式发电系统&#xff08;如太阳能电站、风力发电场&#xff09;如果没有及时与电网断开&#xff0c;就会继续向其周围的一部分用电…

联通 路由器 创维SK-WR9551X 联通华盛VS010 组mesh 和 锐捷X32 PRO 无缝漫游

前言 联通路由器&#xff1a;联通创维SK-WR9551X&#xff0c;联通华盛VS010组mesh&#xff0c;并与锐捷X32 PRO混合组网&#xff0c;开启无限漫游。 1、mesh ≠ 无缝漫游 mesh是实现路由器快速组网的一种方式&#xff0c;通过mesh组网后可以实现无缝漫游。 mesh组网的设备要…

Druid连接Oracle数据库,连接失效导致SQL无法执行

原始配置&#xff1a; type: com.alibaba.druid.pool.DruidDataSource druid:initial-size: 5max-active: 25min-idle: 5max-wait: 10000testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsetimeBetweenEvictionRunsMillis: 2000minEvictableIdleTimeMillis: 600000ma…

JVM调优(内存、GC、JVM参数)

内存调优 常用监控工具 Top命令 top命令是linux下用来查看系统信息的一个命令&#xff0c;它提供给我们去实时地去查看系统的资源&#xff0c;比如执行时的进程、线程和系统参数等信息。进程使用的内存为RES&#xff08;常驻内存&#xff09;- SHR&#xff08;共享内存&…

Cursor登录按钮点击没反应

问题 系统&#xff1a;Windows11 Cursor&#xff1a;Cursor 0.44.9 当安装Cursor打开进行登录时&#xff0c;点击Sign in没反应 解决方案 1.打开window11的设置 2.点击应用中的默认应用 3.在设置应用程序的默认值中搜索Google&#xff08;没有Google浏览器的尝试下载一个&a…

强化学习(1)

Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标&#xff1a;最大化总…

异步请求在TypeScript网络爬虫中的应用

异步请求的重要性 异步请求是现代网络应用中不可或缺的一部分&#xff0c;特别是在网络爬虫领域。它允许爬虫在等待网络响应的同时继续执行其他任务&#xff0c;从而提高效率和性能。在JavaScript和TypeScript中&#xff0c;异步请求可以通过多种方式实现&#xff0c;包括回调…

OpenLinkSaas使用手册-项目外部资源管理

在软件项目开发过程中&#xff0c;会依赖很多外部系统&#xff0c;比如服务器&#xff0c;代码仓库&#xff0c;CI/CD&#xff0c;构件仓库等等。 OpenLinkSaas可以在右侧工具栏中的服务列表中&#xff0c;添加这些外部资源。 进入外部服务列表 代码仓库 一个软件项目可能会…

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册&#xff1a;Docker一键部署Immich&#xff0c;照片视频备份利器 前言 随着人们手机、PC、平板等电子产品多样&#xff0c;我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重要的问题。 传统的云备份虽然方便&…

ArcGIS教程(009):ArcGIS制作校园3D展示图

文章目录 数据下载校园3D展示图制作创建要素类矢量化【楼】要素矢量化【绿地】矢量化【范围】矢量化处理打开ArcScene添加动画数据下载 https://download.csdn.net/download/WwLK123/90189025校园3D展示图制作 创建要素类 添加底图: 新建【文件地理数据库】,并修改名称为【…

Windows安装了pnpm后无法在Vscode中使用

Windows安装了pnpm后无法在Vscode中使用 解决方法&#xff1a; 以管理员身份打开 PowerShell 并执行以下命令后输入Y回车即可。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser之后就可以正常使用了

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持开源鸿蒙OpenHarmony3.2-5.0系统&#xff0c;适合鸿蒙开发入门学习。 编译源码…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法&#xff0c;用于从信号中去除噪声。这种方法基于小波变换&#xff0c;它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤&#xff1a; &#xff08;1&#xff09;小波变换&#xff1a;首先对含噪信…

关于埃斯顿机器人指令含义

等待一组数字量输入指令&#xff0c;用于多个输入数字量的指示&#xff01; DO8421(9.17.0)该指令含义为将9-17端口的虚信号输出为0 (图1) (CALL指令) 子程序调用指令&#xff0c;用于程序中调用子程序 (SetSimDO指令) 设置虚拟数字量输出指令&#xff0c;用于程序中设置虚…