一、Langchain介绍
1、功能介绍
LangChain的作用如下:
- 可以将 LLM 模型与外部数据源进行连接
- 提供一些组件可以更高效的和 LLM 模型进行交互。比如对向量数据库的支持。
langchain功能介绍:

二、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
|

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服务
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
|

三、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, openai_api_key="none", openai_api_base="http://127.0.0.1:8000/v1", model_name="Qwen1.5-1.8B" )
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 )
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'])
|
结果如下:

案例二:简单知识库问答
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
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 )
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)
model_id = "damo/nlp_corom_sentence-embedding_chinese-base" embeddings = ModelScopeEmbeddings( model_id=model_id)
vectorstore = Qdrant.from_documents( documents=chunked_documents, embedding=embeddings, location=":memory:", collection_name="documents")
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=model)
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,作用是先检索后生成,即检索增强生成。