一、Langchain介绍

1、功能介绍

LangChain的作用如下:

  1. 可以将 LLM 模型与外部数据源进行连接
  2. 提供一些组件可以更高效的和 LLM 模型进行交互。比如对向量数据库的支持。

langchain功能介绍:

image-20240724220925102

二、fastchat介绍

1、命令行推理


安装`pip3 install "fschat[model_worker,webui]"`
加载大模型推理 python -m fastchat.serve.cli --model-path /你的下载路径/chatglm2-6b
linux:python -m fastchat.serve.cli --model-path /root/LangChain-ChatGLM-Webui/model/chatglm2-6b
windows: python -m fastchat.serve.cli --model-path D:\project\LangChain-ChatGLM-Webui\model\chatglm2-6b
python -m fastchat.serve.cli --model-path D:\project\LangChain-ChatGLM-Webui\model\Qwen1.5-1.8B

image-20240312095735966

2、web实现


服务器ip ifconfig192.168.230.219

(1)、启动 controller

python3 -m fastchat.serve.controller --host 192.168.230.219 --port 21001
python -m fastchat.serve.controller --host 0.0.0.0

(2)、启动模型

# 必须是本地ip 
python3 -m fastchat.serve.model_worker --load-8bit --model-names chatglm2-6b --model-path /data/models/chatglm3-6b-models --controller-address http://192.168.230.219:21001 --worker-address http://192.168.230.219:8080 --host 0.0.0.0 --port 8080
linux:python -m fastchat.serve.model_worker --model-path /root/LangChain-ChatGLM-Webui/model/chatglm2-6b --host 0.0.0.0 --load-8bit
windows:python -m fastchat.serve.model_worker --model-names chatglm2-6b --model-path D:\project\LangChain-ChatGLM-Webui\model\chatglm2-6b --host 0.0.0.0 --load-8bit
windows:python -m fastchat.serve.model_worker --model-names Qwen1.5-1.8B --model-path D:\project\LangChain-ChatGLM-Webui\model\Qwen1.5-1.8B --host 0.0.0.0 --load-8bit
linux:python -m fastchat.serve.model_worker --model-names Qwen1.5-1.8B --model-path /root/LangChain-ChatGLM-Webui/model/Qwen1.5-1.8B --host 0.0.0.0 --load-8bit
python3 -m fastchat.serve.modelworker --model-names "qwen-api" --model-path "D:\project\LangChain-ChatGLM-Webui\api\qwen.py"

(3)、openapi服务

python3 -m fastchat.serve.openai_api_server --controller-address http://172.17.0.2:21001 --host 0.0.0.0 --port 8000
python -m fastchat.serve.openai_api_server --host 0.0.0.0
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000

(4)、gradio服务

# gradio服务对gradio版本有要求
linux:python -m fastchat.serve.gradio_web_server --host 0.0.0.0
windows:python -m fastchat.serve.gradio_web_server

服务默认端口是 7860,可以通过--port参数来修改端口,还可以通过添加--share参数来开启 Gradio 的共享模式,这样就可以通过外网访问 WebUI 服务

127.0.0.1:7890
curl http://localhost:8000/v1/models

image-20240313202110620

三、Embeeding模型

Embedding 技术已经作为「基本操作」广泛应用于推荐、广告、搜索等互联网核心领域中。Embedding 是用一个低维稠密向量来表示一个对象,使得这个向量能够表达相应对象的某些特征,同时向量之间的距离能反应对象之间的相似性。我们要基于大模型搭建本地知识库,那就必须要用到Embeeding了,将文本数据转化成向量,只有转化成向量,才便于计算机处理。将这些向量存到数据库后,我们可以将要提的问题同样适用Embeeding转化为向量,然后就行语义相似度查询,获取相关的知识信息。

使用如下代码就可以轻松的将语言转化为向量:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-mpnet-base-v2')

四、向量数据库

上文提到,我们会将语句转化为的向量存储到数据库中,这个数据库就是向量数据库。向量数据库主要用于图像检索、音频检索、文本检索等领域,其主要特点是能够高效地存储和检索大规模的向量数据,它用了专门的数据结构和算法来处理向量之间的相似性计算和查询。 通过构建索引结构,向量数据库可以快速找到最相似的向量,以满足各种应用场景中的查询需求。

我们将一些文档信息,也就是知识,分块存到向量数据库中,对于用户的问题,使用 Embedding 的相似度进行语义搜索的技术。然后,我们将和问题语义最接近的前几条内容,作为提示语的一部分给到 AI,就相当于给AI配备一套知识库。

五、实际案例实现

案例一:爬取网页并输出JSON数据

from langchain.prompts import PromptTemplate
from langchain.chains import LLMRequestsChain, LLMChain
from langchain.chat_models import ChatOpenAI


llm = ChatOpenAI(
streaming=True,
verbose=True,
# callbacks=[callback],
openai_api_key="none",
openai_api_base="http://127.0.0.1:8000/v1",
model_name="Qwen1.5-1.8B"
)

# 构造Prompt 模版
template = """在 >>> 和 <<< 之间是网页的返回的HTML内容。
网页是新浪财经A股上市公司的公司简介。
请抽取参数请求的信息。

>>> {requests_result} <<<
请使用如下的JSON格式返回数据
{{
"company_name":"a",
"company_english_name":"b",
"issue_price":"c",
"date_of_establishment":"d",
"registered_capital":"e",
"office_address":"f",
"Company_profile":"g"

}}
Extracted:"""

prompt = PromptTemplate(
input_variables=["requests_result"],
template=template
)

# 利用LLMRequestsChain 访问Url
chain = LLMRequestsChain(llm_chain=LLMChain(llm=llm, prompt=prompt))
inputs = {
"url": "https://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpInfo/stockid/600519.phtml"
}

response = chain(inputs)
print(response['output'])

结果如下:

image-20240724231552816

案例二:简单知识库问答

from langchain.chat_models import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.embeddings import ModelScopeEmbeddings
from langchain.vectorstores import Qdrant
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.chains import RetrievalQA

import os

# 连接本地部署的OpenAI服务
model = ChatOpenAI(
streaming=True,
verbose=True,
callbacks=[],
openai_api_key="none",
openai_api_base="http://127.0.0.1:8000/v1",
model_name="Qwen-7B-Chat",
temperature=0
)

# 加载Documents
base_dir = './files' # 文档的存放目录
documents = []
for file in os.listdir(base_dir):
# 完整的文件路径
file_path = os.path.join(base_dir, file)
if file.endswith('.pdf'):
loader = PyPDFLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.docx'):
loader = Docx2txtLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.txt'):
loader = TextLoader(file_path)
documents.extend(loader.load())

text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10) # 文档分割器
chunked_documents = text_splitter.split_documents(documents)

# 创建 embeedings
model_id = "damo/nlp_corom_sentence-embedding_chinese-base"
embeddings = ModelScopeEmbeddings(
model_id=model_id)

# 加载文档到向量数据库
vectorstore = Qdrant.from_documents(
documents=chunked_documents, # 以分块的文档
embedding=embeddings, # 用OpenAI的Embedding Model做嵌入
location=":memory:", # in-memory 存储
collection_name="documents") # 指定collection_name

# 构建一个MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=model)

# 实例化一个RetrievalQA链
qa_chain = RetrievalQA.from_chain_type(model, retriever=retriever_from_llm)
result = qa_chain("填入你的问题")

print(result)

在上面代码中,首先连接本地部署的OpenAI服务,创建出了model,随后使用 RecursiveCharacterTextSplitter 进行文本分割,设置一个文档块大小为200,重叠字符长度为10。之后初始化Embeeding模型,并使用Qdrant作为向量数据库,读如文档数据并进行Embeeding将自然语言存储成向量。之后查询器使用了MultiQueryRetriever,其特点是使用语言模型从不同的视角为给定的用户输入查询生成多个查询。 然后使用这些查询来检索一组相关文档。下一步,使用RetrievalQA构建了一个Chain,作用是先检索后生成,即检索增强生成。