LangChain基础知识大全

news2024/9/22 14:34:28

LangChain基础知识大全

  • 一、部署ChatGLM-6B
    • 1.拉取源码
    • 2.安装环境
    • 3.下载模型
    • 4.修改api.py配置
    • 5.运行api.py
  • 二、Models组件
    • 1.LLM(大语言模型)
    • 2.Chat Model(聊天模型)
    • 3.Embedding Model(嵌入模型)
      • 3.1 下载中文文本向量模型
      • 3.2 安装包
  • 三、Prompts组件
    • 1.zore-shot提示
    • 2.few-shot提示
  • 四、Chains组件
    • 1.单chain
    • 2.多chain
  • 五、Agents组件
  • 六、Memory组件
    • 1.非持久化存储
    • 2.持久化存储
    • 3.ChatGLM+Memory
  • 七、indexes组件
    • 1.文档加载器
    • 2.文档分割器
      • 2.1 CharacterTextSplitter
      • 2.2 其他分割器
    • 3.VectorStores
      • 3.1 VectorStore汇总
      • 3.2 Chroma
      • 3.3 FAISS
  • 八、ChatGLM+Langchain
    • 1.后端逻辑
    • 2.添加前端交互
    • 3.添加上传文档功能

一、部署ChatGLM-6B

  • 后续会使用到

1.拉取源码

git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B

2.安装环境

conda create --name chatglm python=3.10
conda activate chatglm
pip install -r requirements.txt
# 安装cuda版本的pytorch(需要查看自己cuda的版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

3.下载模型

# 安装modelscope社区的包
pip install modelscope
  • 在ChatGLM-6B的git目录运行以下python代码
from modelscope import snapshot_download

model_dir = snapshot_download('ZhipuAI/ChatGLM-6B', cache_dir='.', revision='master')

下载完后,需要将ChatGLM-6B改成chatglm-6b,否则会报错
在这里插入图片描述

4.修改api.py配置

  • 指定模型的路径在这里插入图片描述

注意:如果CPU/GPU内存不够,那么可以在实例化model的时候,添加 .quantize(4)
           支持4和8的量化

5.运行api.py

  • 这个是git源码的文件
  • python api.py
    在这里插入图片描述

二、Models组件

  • LangChain目前支持三种模型类型:LLMs、ChatModels(聊天模型)、EmbeddingsModels(嵌入模型)。
    • LLMs:大语言模型接收文本字符作为输入,返回的也是文本字符。
    • 聊天模型:基于LLMs,不同的是它接收聊天消息(一种特定格式的数据)作为输入,返回的也是聊天消息。
    • 文本嵌入模型:文本嵌入模型接收文本作为输入,返回的是浮点数列表。

1.LLM(大语言模型)

from langchain_community.llms import ChatGLM

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)

response = llm("生成一个关于创业励志的故事")
print(response)

2.Chat Model(聊天模型)

3.Embedding Model(嵌入模型)

3.1 下载中文文本向量模型

  • modelscope地址:https://modelscope.cn/models/AI-ModelScope/bge-large-zh
from modelscope import snapshot_download

model_dir = snapshot_download('AI-ModelScope/bge-large-zh', cache_dir='.', revision='master')

3.2 安装包

pip install sentence_transformers
pip install langchain==0.2.15
pip install langchain-community==0.2.15```
### 3.3 示例代码
```python
from langchain_community.embeddings import HuggingFaceBgeEmbeddings

model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
model_kwargs = {'device': 'cuda:0'}
encode_kwargs = {'normalize_embeddings': True}
model = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

# 将多段文本向量化,
print(model.embed_documents(["一只乌鸦在喝水"]))
# 返回:[[0.008352028205990791, 0.01422210969030857, -0.010817999951541424, .....], .....]

# 将一个文本向量化,
print(model.embed_query("一只乌鸦在喝水"))
# 返回:[0.015122170560061932, 0.0075872535817325115, ....]

三、Prompts组件

  • Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。
  • 提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain就提供了PromptTemplates组件,它可以更方便的构建提示。

1.zore-shot提示

  • 零样本学习(zore-shot),是指模型在没有任何相关任务示例的情况下,仅根据任务的描述来生成响应。这种学习方式要求模型具备强大的泛化能力和对任务描述的深刻理解。
from langchain_community.llms import ChatGLM
from langchain_core.prompts import PromptTemplate

# 定义模板
template = "给我出一道关于{subject}的题目"
prompt = PromptTemplate(input_variables=["subject"], template=template)
prompt_text = prompt.format(subject="数学")
# prompt_text = "给我出一道关于数学的题目"

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)

response = llm(prompt_text)
print(response)

2.few-shot提示

  • 少样本学习(few-shot),是指通过给模型提供少量(通常是1到几个)的示例来帮助模型理解任务,并生成正确的响应。这种方式可以显著提高模型在新任务上的表现,同时减少对数据量的需求。
from langchain_community.llms import ChatGLM
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate

examples = [
    {"word": "大", "antonym": "小"},
    {"word": "上", "antonym": "下"},
    {"word": "左", "antonym": "右"},
]

example_template = """
单词:{word}  反义词:{antonym}\\n
"""

# 定义模板
example_prompt = PromptTemplate(input_variables=["word", "antonym"], template=example_template)
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,  # 模型训练的案例
    example_prompt=example_prompt,  # 样例的模板
    prefix="给出每个单词的反义词",  # 提示的前缀
    suffix="单词:{input}\\n反义词:",  # 提示的后缀
    input_variables=["input"],  # 在few-shot当中定义的变量
    example_separator="\\n",  # 样例之间都使用换行进行隔开
)

# 格式化文本
prompt_text = few_shot_prompt.format(input="粗")
# 打印的结果如下:
# 给出每个单词的反义词\n
# 单词:大  反义词:小\n
# \n
# 单词:上  反义词:下\n
# \n
# 单词:左  反义词:右\n
# \n单词:粗\n反义词:

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)

response = llm(prompt_text)
print(response)

四、Chains组件

1.单chain

from langchain.chains.llm import LLMChain
from langchain_community.llms import ChatGLM
from langchain_core.prompts import PromptTemplate

# 1.定义模板
template = "给我出一道关于{subject}题目"
prompt = PromptTemplate(input_variables=["subject"], template=template)

# 2.链条
llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)
chain = LLMChain(llm=llm, prompt=prompt)

# 3.执行chain(将传入的参数,作为最开始的提示词,传入到llm第一个节点)
result = chain.run("数学加减乘除根号的")
print("result: ", result)

2.多chain

from langchain.chains.llm import LLMChain
from langchain.chains.sequential import SimpleSequentialChain
from langchain_community.llms import ChatGLM
from langchain_core.prompts import PromptTemplate


llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)
# 创建第一个链条
first_template = "给我出一道关于{subject}题目"
first_prompt = PromptTemplate(input_variables=["subject"], template=first_template)
first_chain = LLMChain(llm=llm, prompt=first_prompt)

# 创建第二个链条
second_template = "请解答题目:{subject2}"
second_prompt = PromptTemplate(input_variables=["subject2"], template=second_template)
second_chain = LLMChain(llm=llm, prompt=second_prompt)

# 连接两条链,verbose=True 可以显示推理过程
overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)

# 执行链,只需要传入第一个参数
result = overall_chain.run("数学加减乘除根号的")
print("result: ", result)

五、Agents组件

  • 在LangChain 中 Agents的作用就是根据用户的需求,来访问一些第三方工具(比如:搜索引擎或者数据库),进而来解决相关需求问题。
  • 为什么要借助第三方库?
    • 因为大模型虽然非常强大,但是也具备一定的局限性,比如不能回答实时信息、处理数学逻辑问题仍然非常的初级等等。因此,可以借助第三方工具来辅助大模型的应用。
    • Agent代理
      • 制定计划和思考下一步需要采取的行动
      • 负责控制整段代码的逻辑和执行,代理暴露了一个接口,用来接收用户输入,并返回AgentAction或AgentFinish。
    • Toolkit工具包一些集成好了代理包,比如create_csv_agent 可以使用模型解读csv文件。
    • Tool工具
      • 解决问题的工具
      • 第三方服务的集成,比如计算器、网络搜索(谷歌、bing)等等。
    • AgentExecutor代理执行器:它将代理和工具列表包装在一起,负责迭代运行代理的循环,直到满足停止的标准。
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain_community.llms import ChatGLM
from langchain_core.prompts import PromptTemplate

# 现在我们实现一个使用代理的例子:假设我们想查询一下中国目前有多少人口?我们可以使用多个代理工具,让Agents选择执行。
# 需要安装依赖库:
#   pip install wikipedia
#   pip install numexpr
# 加载内置工具 llm-math和 wikipedia

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)
tools = load_tools(["llm-math", "wikipedia"], llm=llm)

agent = initialize_agent(tools=tools,
                         llm=llm,
                         agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
                         verbose=True)
prompt_template = "哪个国家的人最多?"
prompt = PromptTemplate.from_template(prompt_template)
result = agent.run(prompt)

六、Memory组件

  • 大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。
  • 因此LangChain也提供了Memory组件,Memory分为两种类型:短期记忆长期记忆
    • 短期记忆:一般指单一会话时传递数据
    • 长期记忆:则是处理多个会话时获取和更新信息。
  • 目前的Memory组件只需要考虑ChatMessageHistory。举例分析:

1.非持久化存储

from langchain_community.chat_message_histories import ChatMessageHistory

history = ChatMessageHistory()
# 用户提问:吃了吗? 存储到历史记录对象
history.add_user_message("吃了吗?")
# AI回答:吃了... 存储到历史记录对象
history.add_ai_message("吃了...")

print(history.messages)
# [HumanMessage(content='吃了吗?'), AIMessage(content='吃了...')]

2.持久化存储

  • 核心函数:
    • message_to_dict:将历史记录转化为字典
    • message_from_dict:将字典转化为历史记录
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.messages import messages_to_dict, messages_from_dict

history = ChatMessageHistory()
# 用户提问:吃了吗? 存储到历史记录对象
history.add_user_message("吃了吗?")
# AI回答:吃了... 存储到历史记录对象
history.add_ai_message("吃了...")

print(history.messages)
# [HumanMessage(content='吃了吗?'), AIMessage(content='吃了...')]

# 转化为字典
dicts = messages_to_dict(history.messages)

# 字典转化为历史聊天记录
history = messages_from_dict(dicts)

3.ChatGLM+Memory

from langchain.chains.conversation.base import ConversationChain
from langchain_community.llms.chatglm import ChatGLM

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=80000,
    top_p=0.9
)

conversation = ConversationChain(llm=llm)

result1 = conversation.predict(input="我的语文是82")
print("result1: ", result1)

result2 = conversation.predict(input="我的数学88")
print("result2: ", result2)

result3 = conversation.predict(input="我的数学和语文成绩一共多少分?")
print("result3: ", result3)

# 最终效果:
# result1:  你的语文是82分,很高!是阅读、写作和口语方面的表现吗?
# result2:  你的数学是88分,也很不错!是选择题、填空题和解答题的表现吗?
# result3:  你的语文和数学成绩一共是170分。

七、indexes组件

  • Indexes组件的目的是让LangChain具备处理文档处理的能力,包括:文档加载、检索等。这里的文档不局限于txt、pdf等文本类内容,还涵盖email、区块链、视频等内容。
    • 文档加载器。
    • 文本分割器
    • VectorStores
    • 检索器

1.文档加载器

  • 文档加载器可以基于TextLoader包
  • 文档加载器使用起来很简单,只需要引入相应的loader工具:
from langchain_community.document_loaders import TextLoader

loader = TextLoader("./test.txt", encoding="utf8")
doc = loader.load()
print("doc: ", doc)
print(len(doc))
print(doc[0].page_content[:10])

2.文档分割器

  • 由于模型对输入的字符长度有限制,我们在碰到很长的文本时,需要把文本分割成多个小的文本片段。
  • 文本分割最简单的方式是按照字符长度进行分割,但是这会带来很多问题,比如说如果文本是一段代码,一个函数被分割到两段之后就成了没有意义的字符,所以整体的原则是把语义相关的文本片段尽可能的放在一起。
  • LangChain中最基本的文本分割器是CharacterTextSplitter,它按照指定的分隔符(默认"n\n")进行分割,并且考虑文本片段的最大长度。

2.1 CharacterTextSplitter

from langchain.text_splitter import CharacterTextSplitter

# 实例化一个文本分割对象
text_splitter = CharacterTextSplitter(
    separator=" ", # 分隔符,案例空格分割(注:如果没有空格,那么会不会分割,直到找到空格为止)
    chunk_size=5, # 指每个分割文本块的大小,案例为5个
    chunk_overlap=2, # 每块之间重叠的字符。有重复的内容 才更好的衔接上下文
)

# 一句分割
text = text_splitter.split_text("a b c d e f g")
print(text)

# 多句话分割
texts = text_splitter.create_documents(["a b c d e f g", "h i j k l m n"])

2.2 其他分割器

文档分割器描述
LatexTextSplitter沿着Latex标题、标题、枚举等分割文本
MarkdownTextSplitter沿着Markdown的标题、代码块或水平规则来分割文本
TokenTextSplitter根据openAl的token数进行分割
PythonCodeTextSplitter沿着Python类和方法的定义分割文本

3.VectorStores

  • Vectorstores是一种特殊类型的数据库,它的作用是存储由嵌入创建的向量,提供相似查询等功能。

3.1 VectorStore汇总

VectorStore描述
Chroma一个开源嵌入式数据库
ElasticSearchElasticSearch
Milvus用于存储、索引和管理由深度神经网络和其他机器学习(ML)模型产生的大量嵌入向量的数据库
Redis基于Redis的检索器
FAISSFacebook AI相似性搜索服务
Pinecone一个具有广泛功能的向量数据库

3.2 Chroma

  • 安装:pip install chromadb
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Chroma


def get_embedding_model():
    model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
    model_kwargs = {'device': 'cuda:0'}
    encode_kwargs = {'normalize_embeddings': True}
    return HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )


# 1.读取文档里面的内容
with open("./test.txt", encoding="utf8") as f:
    doc_content = f.read()

# 2.切分文档
# 实例化一个文本分割对象
text_splitter = CharacterTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
)
texts = text_splitter.split_text(doc_content)

# 3.将切分后的文档向量化并保存
embedding_model = get_embedding_model()
doc_search = Chroma.from_texts(texts=texts, embedding=embedding_model)

query = "我今年三十七岁。现在,我正坐在哪里?"
result = doc_search.similarity_search(query)
# result就是和query相似度最近的一段文本
print(result)

3.3 FAISS

  • 安装包
pip install faiss-gpu # For CUDA 7.5+ Supported GPU's.
# OR
pip install faiss-cpu # For CPU Installation
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Chroma, FAISS


def get_embedding_model():
    model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
    model_kwargs = {'device': 'cuda:0'}
    encode_kwargs = {'normalize_embeddings': True}
    return HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )


# 1.读取文档里面的内容
with open("./test.txt", encoding="utf8") as f:
    doc_content = f.read()

# 2.切分文档
# 实例化一个文本分割对象
text_splitter = CharacterTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
)
texts = text_splitter.split_text(doc_content)

# 3.将切分后的文档向量化并保存
embedding_model = get_embedding_model()
doc_search = FAISS.from_texts(texts=texts, embedding=embedding_model)
# 每次检索返回最相关的两个文档。默认是1个
doc_search = doc_search.as_retriever(search_kwargs={"k": 2})

query = "我今年三十七岁。现在,我正坐在哪里?"
result = doc_search.get_relevant_documents(query)
# result就是和query相似度最近的一段文本
print(result)

八、ChatGLM+Langchain

1.后端逻辑

import os

from langchain.chains.retrieval_qa.base import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.llms.chatglm import ChatGLM
from langchain_community.vectorstores import Chroma


def load_documents(directory="book"):
    # 1.读取文档里面的内容
    # 需要安装:pip install unstructured
    # 在windows下面报错:failed to find libmagic
    #       解决办法:pip uninstall python-magic
    #               pip install python-magic-bin==0.4.14
    loader = DirectoryLoader(directory)
    documents = loader.load()
    # 2.切分文档
    # 实例化一个文本分割对象
    text_splitter = CharacterTextSplitter(
        chunk_size=256,
        chunk_overlap=20,
    )
    return text_splitter.split_documents(documents)


def get_embedding_model():
    model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
    model_kwargs = {'device': 'cuda:0'}
    encode_kwargs = {'normalize_embeddings': True}
    return HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )


def store_chroma(docs, embedding_model, persis_directory="VectorStore"):
    if not os.path.exists(persis_directory):
        # 实际测试,这里需要6秒
        return Chroma.from_documents(docs, embedding_model, persist_directory=persis_directory).persist()
    # 实际测试,这里仅需要0.4秒
    return Chroma(persist_directory=persis_directory, embedding_function=embedding_model)


def load_chatglm_model():
    return ChatGLM(
        endpoint_url="http://127.0.0.1:8000",
        max_token=80000,
        top_p=0.9
    )


persis_directory = "VectorStore"
documents = load_documents()
embedding_model = get_embedding_model()
db = store_chroma(documents, embedding_model)
llm = load_chatglm_model()
# 创建QA
qa = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever()
)
# 提问
result = qa.run("我今年三十七岁。现在,我正坐在哪里?")
print(result)
# 回答:You are currently sitting in a波音747机舱.
# 问题:中英文混合回答,有问题(后面会解决)

2.添加前端交互

  • 安装:pip install gradio
import os
import gradio as gr
from langchain.chains.retrieval_qa.base import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.llms.chatglm import ChatGLM
from langchain_community.vectorstores import Chroma


def load_documents(directory="book"):
    # 1.读取文档里面的内容
    # 需要安装:pip install unstructured
    # 在windows下面报错:failed to find libmagic
    #       解决办法:pip uninstall python-magic
    #               pip install python-magic-bin==0.4.14
    loader = DirectoryLoader(directory)
    documents = loader.load()
    # 2.切分文档
    # 实例化一个文本分割对象
    text_splitter = CharacterTextSplitter(
        chunk_size=256,
        chunk_overlap=20,
    )
    return text_splitter.split_documents(documents)


def get_embedding_model():
    model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
    model_kwargs = {'device': 'cuda:0'}
    encode_kwargs = {'normalize_embeddings': True}
    return HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )


def store_chroma(docs, embedding_model, persis_directory="VectorStore"):
    if not os.path.exists(persis_directory):
        # 实际测试,这里需要6秒
        return Chroma.from_documents(docs, embedding_model, persist_directory=persis_directory).persist()
    # 实际测试,这里仅需要0.4秒
    return Chroma(persist_directory=persis_directory, embedding_function=embedding_model)


def load_chatglm_model():
    return ChatGLM(
        endpoint_url="http://127.0.0.1:8000",
        max_token=80000,
        top_p=0.9
    )


persis_directory = "VectorStore"
documents = load_documents()
embedding_model = get_embedding_model()
db = store_chroma(documents, embedding_model)
llm = load_chatglm_model()
# 创建QA
qa = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever()
)


def chat(question, history):
    return qa.run(question)


demo = gr.ChatInterface(chat)
demo.launch(inbrowser=True)

3.添加上传文档功能

import os
import time

import gradio as gr
from langchain.chains.retrieval_qa.base import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.llms.chatglm import ChatGLM
from langchain_community.vectorstores import Chroma


def load_documents(directory="book"):
    # 1.读取文档里面的内容
    # 需要安装:pip install unstructured
    # 在windows下面报错:failed to find libmagic
    #       解决办法:pip uninstall python-magic
    #               pip install python-magic-bin==0.4.14
    loader = DirectoryLoader(directory)
    documents = loader.load()
    # 2.切分文档
    # 实例化一个文本分割对象
    text_splitter = CharacterTextSplitter(
        chunk_size=256,
        chunk_overlap=20,
    )
    return text_splitter.split_documents(documents)


def get_embedding_model():
    model_name = r"C:\practice\python\langchain\ChatGLM-6B\AI-ModelScope\bge-large-zh"
    model_kwargs = {'device': 'cuda:0'}
    encode_kwargs = {'normalize_embeddings': True}
    return HuggingFaceBgeEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )


def get_chroma_db(embedding_model, persis_directory="VectorStore"):
    return Chroma(persist_directory=persis_directory, embedding_function=embedding_model)


def store_chroma(docs, embedding_model, persis_directory="VectorStore"):
    db = Chroma.from_documents(docs, embedding_model, persist_directory=persis_directory)
    db.persist()


def load_chatglm_model():
    return ChatGLM(
        endpoint_url="http://127.0.0.1:8000",
        max_token=80000,
        top_p=0.9
    )


persis_directory = "VectorStore"
documents = load_documents()
embedding_model = get_embedding_model()
# 加载chroma数据库
db = get_chroma_db(embedding_model=embedding_model)
# 存储数据
store_chroma(documents, embedding_model)
# 加载chatglm大模型
llm = load_chatglm_model()
# 创建QA
qa = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever()
)


def add_text(history, text):
    history = history + [(text, None)]
    return history, gr.update(value="", interactive=False)


def add_file(history, file):
    # 拿到上传的文件夹
    directory = os.path.dirname(file.name)
    documents = load_documents(directory)
    store_chroma(documents, embedding_model)
    history = history + [(file.name, None)]
    return history


def bot(history):
    message = history[-1][0]
    if os.path.sep in message and os.path.exists(message):
        # 是上传文件
        response = "文件上传成功"
    else:
        response = qa.run(message)
    history[-1][1] = ""
    for character in response:
        history[-1][1] += character
        time.sleep(0.05)
        yield history


with gr.Blocks() as demo:
    chat_bot = gr.Chatbot(
        [],
        elem_id="chatbot",
        bubble_full_width=False,
        avatar_images=(None, (os.path.dirname(__file__), r"C:\practice\python\langchain\ChatGLM-6B\icon.jpg"))
    )

    with gr.Row():
        txt = gr.Textbox(
            scale=4,
            show_label=False,
            placeholder="Enter text and press enter, or upload an image",
            container=False
        )
        btn = gr.UploadButton("上传文档", file_types=['txt'])

    txt_msg = txt.submit(add_text, [chat_bot, txt], [chat_bot, txt], queue=False).then(
        bot, chat_bot, chat_bot
    )

    txt_msg.then(lambda: gr.update(interactive=True), None, [txt], queue=False)
    file_msg = btn.upload(add_file, [chat_bot, btn], [chat_bot], queue=False).then(
        bot, chat_bot, chat_bot
    )
demo.queue()
if __name__ == '__main__':
    demo.launch()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍 2款 Oracle 开发工具

准备工作 Oracle SQL Developer 下载(免费) Oracle 的官方网站下载 Oracle SQL Developer。以下是下载的步骤: 访问 Oracle SQL Developer 官方下载页面。点击页面上的“下载”链接。选择适合你操作系统的版本(Windows、macO…

Spark原理及调优

spark官档 hints:https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html调优参数:https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries作者几乎把所有的RDD API查了个遍&…

Python 中的 Socket 编程入门

Python 中的 Socket 编程入门 Socket 编程是网络编程的重要组成部分,允许计算机通过网络进行通信。在 Python 中,使用内置的 socket 模块,开发者可以轻松地实现客户端和服务器之间的交互。本文将详细介绍 Python 中的 Socket 编程&#xff0…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一:格式 docker rmi 要…

19.初始C语言指针

初始C语言指针 1.指针的认识2.指针变量的引入3.指针变量的类型4.指针的应用场景15.指针的应用场景26.作业 1.指针的认识 指针 地址 //int a 10; //类型 变量名 内存地址 值 1.变量名直接访问2.通过地址访问&:取地址运算符* :将地址内的值读取…

数据库数据恢复—Oracle报错“需要更多的恢复来保持一致性”的数据恢复案例

Oracle数据库故障&检测: 打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,…

GitHub 上高星 AI 开源项目推荐

FIFO-Diffusion 介绍:FIFO-Diffusion 是一个创新的开源项目,它能够基于文本描述生成无限长度的高品质视频,而无需任何预先的模型训练。这一技术的核心在于其高效的内存管理策略和先进的扩散模型,使得即使是小型GPU配置也能轻松应…

1018. 可被 5 整除的二进制前缀

目录 一:题目: 二:代码: 三:结果: 一:题目: 给定一个二进制数组 nums ( 索引从0开始 )。 我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。 …

数据结构之栈(python)

栈(顺序栈与链栈) 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作(包含入栈和出栈)2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

IDEA去除掉虚线,波浪线,和下划线实线的方法

初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法&#…

Linux:权限管理

基本权限和归属 权限和归属 基本权限与归属 • 访问权限 – 读取:允许查看内容-read – 写入:允许修改内容-write – 可执行:允许运行和切换-excute对于文本文件:r读取权限:cat、less、grep、head、tailw写入权限&am…

linux下共享内存的3种使用方式

进程是资源封装的单位,内存就是进程所封装的资源的一种。一般情况下,进程间的内存是相互隔离的,也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存,那么必须要进过内核这个桥梁,这就是…

中国雕塑—孙溟㠭凿刻印《自然贼》

中国雕塑孙溟㠭凿刻作品《自然贼》 孙溟㠭凿刻印《自然贼》 遵循自然之法谓之道,脱离自然之道谓之贼,道法自然。丙申秋月溟展刊。 孙溟㠭凿刻印《自然贼》 这方《自然贼》,红木章料,半尺见方,自然古朴,浑…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片?您,无需惊慌,因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone,您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如,您的所有照片都会自动备份到 iCloud 存…

【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离 (三)决策规则1、分类决策规则2、回归决策规则 三、算法优缺点优点缺点 四、KNN分类任务实现对比&am…

音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别

技术背景 好多开发者跟我们做技术交流的时候,会问我们,为什么有Unity3D的RTMP|RTSP播放模块,还有RTMP推送和轻量级RTSP服务模块,为什么不去支持虚幻引擎?二者区别在哪里?本文就Unity3D和虚幻引擎之间的差异…

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

鼻咽癌中三级淋巴结构的单细胞与空间转录组分析|文献精析·24-09-22

小罗碎碎念 研究团队通过单细胞和空间转录组分析&#xff0c;揭示了与鼻咽癌进展和免疫治疗反应相关的三级淋巴结构。 作者角色作者姓名单位&#xff08;中文&#xff09;第一作者Yang Liu/通讯作者Jin-Xin Bei国家癌症中心南方肿瘤学重点实验室&#xff0c;鼻咽癌诊断治疗广东…

机器学习04-逻辑回归(python)-02原理与损失函数

​​​​​​​ 1. 逻辑回归概念 逻辑回归&#xff08;Logistic Regression&#xff09; 是一种 分类模型&#xff0c;主要用于解决 二分类问题&#xff08;即分成两类&#xff0c;如是否通过、是否患病等&#xff09;。逻辑回归的目标是根据输入的特征预测一个 概率&#xff0…

C++——关联式容器(4):set和map

在接触了诸如二叉搜索树、AVL树、红黑树的树形结构之后&#xff0c;我们对树的结构有了大致的了解&#xff0c;现在引入真正的关联式容器。 首先&#xff0c;先明确了关联式容器的概念。我们之前所接触到的如vector、list等容器&#xff0c;我们知道他们实际上都是线性的数据结…