LangChain是一个基于语言模型开发应用程序的框架,旨在简化大型语言模型(LLM)的应用开发过程。它提供了一套工具、组件和接口,帮助开发者快速构建端到端的应用程序,而无需深入了解底层技术细节。
LangChain 是一个开源的基于 LLM 的上层应用开发框架,LangChain 提供了一系列的工具和接口,让开发者可以轻松地构建和部署基于 LLM 的应用 。LangChain 围绕将不同组件“链接”在一起的核心概念构建,简化了与 GPT-3.5、GPT-4 等 LLM 合作的过程,使得我们可以轻松创建定制的高级用例。
LangChain 已经成为大模型应用开发的最主流框架(之一),2023年1月的众多AI Hackathon 决赛项目使用 LangChain。2023年融资3000w+美刀(红杉)。目前,LangChain支持Python和TypeScript两种语言。如果大家想体验 LangChain ,建议使用python语言,简单易上手。
构建一个问答系统可能涉及: 1. 用 Document Loader 加载知识库。 2. 通过 Embedding Model 和 Vector Store 建立索引。 3. 使用 Retriever 获取相关文档片段。 4. 通过 Prompt Template 构造输入。 5. 调用 LLM 生成答案,并用 Output Parser 格式化结果。
pip install langchain==0.3.4
pip install langchain_community==0.3.5
pip install -U langchain-openai==0.2.5
这三个库都与构建和使用自然语言处理(NLP)和人工智能(AI)应用有关。下面是每个库的简要介绍:
Langchain中包含两种语言模型:LLMs(纯文本补全模型)和ChatModels(专门针对对话进行了调整的模型)。 其中LLMs以字符串作为输入并返回字符串而ChatModels以消息列 表作为输入并返回消息。 LLMs比较好理解输入输出都是字符串。
我们来说一下ChatModels。ChatModels输入是一个ChatMessage列表。而输出是一个单独的ChatMessage,一个ChatMessage具有两个必需的组件:
Langchain为LLMs和ChatModels都提供了标准接口。 from langchain_openai import OpenAI是纯文本补全模型。它们包装的 API 将字符串提示作为输入并输出字符串完成。from langchain_openai import ChatOpenAI是聊天模型,通常由LLMs支持,但专门针对对话进行了调整。
但这种方式需要OpenAI的api,如果不使用VPN,那么我们无法使用。下面介绍两种Langchain部署本地大模型的方法。
首先运行start_vllm.sh,启动vllm推理服务器。
python -m vllm.entrypoints.openai.api_server --port 10222 --model /root/autodl-tmp/DeployModelDemo/models/Qwen/Qwen2___5-0___5B-Instruct --served-model-name Qwen2___5-0___5B-Instruct &
vllm_langchain_model.py
from langchain_openai import OpenAI
from langchain_openai import ChatOpenAI
llm = OpenAI(
openai_api_key="EMPTY",
base_url="http://127.0.0.1:10222/v1",
model="Qwen2___5-0___5B-Instruct"
)
chat_model = ChatOpenAI(
openai_api_key="EMPTY",
base_url="http://127.0.0.1:10222/v1",
model="Qwen2___5-0___5B-Instruct"
)
print(llm.invoke("你好"))
print("----------------------------------")
print(chat_model.invoke("你好"))
运行效果:
您好!很高兴为您提供咨询服务。请问您有什么问题吗?我可以随时为您提供帮助。
如果您有任何疑问或需要解答的问题,请随时告诉我,我会尽力为您提供帮助。同时,如果您有任何需要咨询的领域或问题,也欢迎随时向我提问。我会尽我所能为您提供最准确、最详细和最合适的解答。请您放心,我会尽量满足您的需求。如果需要的话,我还会为您提供一些其他信息或建议。请随时提出您的需求。我将竭诚为您服务。祝您一切顺利!
希望您有一个愉快的一天!如果需要其他帮助,请随时告诉我。再次感谢您的关注和信任!
祝好!
(您的名字)
(您的联系方式)
(您的教育背景)
(您的工作经验)
(您的专业特长)
(您的兴趣爱好)
(您的职业发展目标)
(您的目标行业)
(您的目标职位)
(您的目标公司)
(您的目标团队)
(您的目标项目)
(您的目标客户)
(您的目标客户群体)
(您的目标客户反馈)
(您的目标客户规模)
(您的目标客户分析)
(您的目标客户细分)
(您的目标客户价值)
(您的目标客户
----------------------------------
content='你好!很高兴为您提供帮助。有什么我可以帮助您的吗?' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 30, 'total_tokens': 43, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'Qwen2___5-0___5B-Instruct', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run--897bc67e-525f-4d9b-9098-075cffb71599-0' usage_metadata={'input_tokens': 30, 'output_tokens': 13, 'total_tokens': 43, 'input_token_details': {}, 'output_token_details': {}}
文本补全方式:
# 补全
from langchain.llms.base import LLM
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained("models/Qwen/Qwen2___5-0___5B-Instruct", torch_dtype=torch.float16).to(device)
tokenizer = AutoTokenizer.from_pretrained("models/Qwen/Qwen2___5-0___5B-Instruct")
class CustomLLM(LLM):
def _call(self, prompt:str, stop: list=None) -> str:
# 将输入的prompt转成模型的输入格式
inputs = tokenizer(prompt, return_tensors="pt").to(device)
# 生成
outputs = model.generate(**inputs)
# 解码输出
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return generated_text
@property
def _identifying_params(self):
# 返回模型的表示信息
return {"model_path": model.config.name_or_path}
@property
def _llm_type(self):
# 返回模型的类型标识
return "custom"
# 使用模型
local_llm = CustomLLM()
result = local_llm("你好")
print(result)
运行效果:
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
/root/autodl-tmp/LangChainDemo/llm.py:37: LangChainDeprecationWarning: The method `BaseLLM.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
result = local_llm("你好")
你好,我有一个问题想问。
您好!很高兴为您提供帮助。请问您有什么问题呢?我会
聊天方式:
from langchain.llms.base import LLM
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained("models/Qwen/Qwen2___5-0___5B-Instruct", torch_dtype=torch.float16).to(device)
tokenizer = AutoTokenizer.from_pretrained("models/Qwen/Qwen2___5-0___5B-Instruct")
class CustomChatLLM(LLM):
def _call(self, prompt:str, stop: list=None) -> str:
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generates_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generates_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generates_ids)
]
reponse = tokenizer.batch_decode(generates_ids, skip_special_tokens=True)[0]
return reponse
@property
def _identifying_params(self):
# 返回模型的表示信息
return {"model_path": model.config.name_or_path}
@property
def _llm_type(self):
# 返回模型的类型标识
return "custom"
# 使用模型
local_llm = CustomChatLLM()
result = local_llm("你好")
print(result)
运行效果:
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
/root/autodl-tmp/LangChainDemo/chatmodel.py:51: LangChainDeprecationWarning: The method `BaseLLM.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
result = local_llm("你好")
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
你好!很高兴能帮助你。请问你需要什么帮助?