langchain默认对接的OpenAI的chatgpt,如果要使用自己的模型的话,首先需要把自己的模型服务化,也就是提供一个web api,然后通过LLMs接入,比如我自己做了一个接口和ChatGPT类似的接口。

格式差不多是这样:

curl http://www.baifachuan.com:8004/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer token1" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}'

{
"id": "chatcmpl-77PZm95TtxE0oYLRx3cxa6HtIDI7s",
"object": "chat.completion",
"created": 1682000966,
"model": "gpt-3.5-turbo-0301",
"usage": {
"prompt_tokens": 10,
"completion_tokens": 10,
"total_tokens": 20
},
"choices": [
{
"message": {
"role": "assistant",
"content": "Hello! How can I help you today?"
},
"finish_reason": "stop",
"index": 0
}
]
}

然后重载一下LLM,整个代码非常简单:

import time
import logging
import requests
from typing import Optional, List, Dict, Mapping, Any

import langchain
from langchain.llms.base import LLM
from langchain.cache import InMemoryCache

logging.basicConfig(level=logging.INFO)
# 启动llm的缓存
langchain.llm_cache = InMemoryCache()

class ChatGLM(LLM):
# 模型服务url
url = "http://www.baifachuan.com:8004/v1/chat/completions"
chat_history = []

@property
def _llm_type(self) -> str:
return "chatglm"

def _construct_query(self, prompt: str) -> Dict:
"""构造请求体
"""
self.chat_history.append({"role": "user", "content": prompt})
query = {
"model": "gpt-3.5-turbo",
"messages": self.chat_history
}
return query

@classmethod
def _post(cls, url: str,
query: Dict) -> Any:
"""POST请求
"""
_headers = {"Content_Type": "application/json", "Authorization": "Bearer token1"}
with requests.session() as sess:
resp = sess.post(url,
json=query,
headers=_headers,
timeout=60)
return resp

def _call(self, prompt: str,
stop: Optional[List[str]] = None) -> str:
"""_call
"""
# construct query
query = self._construct_query(prompt=prompt)

# post
resp = self._post(url=self.url,
query=query)

if resp.status_code == 200:
resp_json = resp.json()
self.chat_history.append(resp_json['choices'][0]['message'])
predictions = resp_json['choices'][0]['message']['content']
return predictions
else:
return "请求模型"

@property
def _identifying_params(self) -> Mapping[str, Any]:
"""Get the identifying parameters.
"""
_param_dict = {
"url": self.url
}
return _param_dict


if __name__ == "__main__":
llm = ChatGLM()
while True:
human_input = input("Human: ")

begin_time = time.time() * 1000
# 请求模型
response = llm(human_input, stop=["you"])
end_time = time.time() * 1000
used_time = round(end_time - begin_time, 3)
logging.info(f"chatGLM process time: {used_time}ms")

print(f"ChatGLM: {response}")

由于已经有了一个继承LLM的ChatGLM,那么就可以无缝的和langchain对应起来了:

from langchain.tools import ShellTool
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor

from chat_glm import ChatGLM

shell_tool = ShellTool()

llm = ChatGLM()

shell_tool.description = shell_tool.description + f"args {shell_tool.args}".replace("{", "{{").replace("}", "}}")
self_ask_with_search = initialize_agent([shell_tool], llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
self_ask_with_search.run("执行echo 1,返回执行结果。")

ChatGLM可以完成对话能力,但是对于action的能力,相对薄弱很多,这部分只能做微调了。


扫码手机观看或分享: