笔记目录
一. 环境搭建
做了三次环境配置尝试,前两次失败了,所以用了第三种粗糙的方式
1.
create --name llm-app --file requirements_windows.txt -c conda-forge -c anaconda
失败,有大量冲突的 (后两个参数是因为我的清华源有一些包没有,我加了两个源)
2.
create --name llm-app
pip install -r x.txt
会报告一些包装不了。然后去掉这些包,单独装,也不行。
3. 暂时简单装装环境
conda create -n llmfirst python=3.9
conda activate llmfirst
pip install langchain==0.0.292
pip install openai==0.27.6
pip install numpy==1.26.2
pip install scikit-learn==1.3.2
pip install urllib3==2.1.0
二. 代码介绍
看了第二章,自己跟着教程写了jupyter,跟着跑了,就是文心的api每日访问限额应该挺少,访问了几次就不给访问。
想汇总代码供以后用的时候,发现仓库里已经有很好的汇总代码
llm-universe/project/llm/call_llm.py
,推荐大家一看。
接下来我简单介绍一下
llm-universe-main/project/
目录下的内容:
call_llm.py
中 进行了get_completion的统一实现。[self_llm/wenxin_llm/zhupuai_llm/spark_llm].py
就将三家的api封装成了LLM类, 供langchain使用。
解释下"供langchain使用"是什么意思?
要使用langchain的chain等实现思维链, 需要有一个封装了更多细节的LLM对象。
而openai等个别大模型, langchain已经为其封装好了, 也就是langchain.chat_models.ChatOpenAI
而对于文心/星火/智谱等, langchain没有封装, 需要自己封装。
封装过程就是继承
langchain.llms.base.LLM,
然后实现
_call
函数
之后这个自定义LLM类就同ChatOpenAI一样使用了.
下面是我对
call_llm.py
代码结构做出的注释
import ...
############ router to different get_completion_xxx ############
def get_completion(prompt :str, model :str, temperature=0.1..)
# router to get different api_key
def parse_llm_api_key(model:str, env_file:dict()=None)
############ 调用各家的原生接口进而封装成get_completion_xxx ############
############ openai ############
def get_completion_gpt(prompt : str, model : str, temperature : float, api_key:str, max_tokens:int):
############ wenxin ############
def get_access_token(api_key, secret_key):
def get_completion_wenxin(prompt : str, model : str, temperature : float, api_key:str, secret_key : str):
############ spark ############
############ get_completion_spark传给下边的spark_main相应的url和参数, 该函数会通过讯飞指定的websocket(不是post方式)请求回应 ############
def get_completion_spark(prompt : str, model : str, ..):
############ zhipuai ############
def get_completion_glm(prompt : str, model : str, temperature, ..):
"""
上边仅是对get_completion的统一实现。 而要使用langchain的chain等函数, 需要有一个封装了更多东西的LLM对象。
而openai等个别大模型, langchain已经为其封装好了, 也就是langchain.chat_models.ChatOpenAI
而对于文心/星火/智拍, langchain没有封装, 需要自己封装。
封装过程就是继承langchain.chat_models.ChatBase, 然后实现get_completion函数
或者继承langchain.llms.base.LLM, 然后实现_call函数. 之后这个自定义LLM类就同ChatOpenAI一样使用了.
而llm-universe-main/project下的另外四个文件: self_llm/wenxin_llm/zhupuai_llm/spark_llm 就将三家的api封装成了LLM类, 供langchain使用
"""
"""
下边就是通过websocket访问讯飞的spark_main函数实现
而notebook文件夹那边(也就是gitbook教程上)的逻辑是 在SparkApiSelf.py中实现一个以websocket访问讯飞的main函数,
然后在spark_api.py中, 装饰了@fastapi_app.post("/spark/")的get_spark_response函数 会接受post请求, 调用main函数。
然后四种方式都可以通过统一的post格式去访问
"""
##### 准备几个函数给spark_main中的 ws=websocket.WebSocketApp(wsUrl, on_message, on_error, on_close, on_open)使用 ###
# 这四个是编写收到websocket错误/关闭/连接建立/消息的处理
answer = ""
class Ws_Param(object):
def __init__(self)
def create_url(self)
def on_error(ws, error):
def on_close(ws,one,two):
def on_open(ws):
def on_message(ws, message):
# 这两个是包装data成dict并准备发送
def gen_params(appid, domain,question, temperature, max_tokens):
def run(ws, *args):
##### 接受参数, 请求星火 API, 返回答案 (汇总使用上边的小函数)
def spark_main(appid, api_key, api_secret, Spark_url,domain, question, temperature, max_tokens):
三. langchain调用本地大模型
这个就之后等和向量数据库的笔记一块放上来吧