当前位置: 首页 > news >正文

《LlamaIndex 之美》-01-LLM、Prompt、Embedding基础入门

在基于数据构建任何 LLM 应用程序时,选择合适的大型语言模型 (LLM) 是您需要考虑的首要步骤之一。

LLM 是 LlamaIndex 的核心组成部分。它们可以作为独立模块使用,也可以插入到其他核心 LlamaIndex 模块(索引、检索器、查询引擎)中。

LlamaIndex 提供了一个统一的接口来定义 LLM 模块,支持对接世面上多种LLM大模型能力。

  • 支持文本完成聊天端点
  • 支持流式处理和非流式处理终结点
  • 支持同步异步端点

本Llamaindex系列文章使用的模型是阿里的灵积平台

Llamaindex 对接 QWen LLM

在Llamaindex中使用LLM很简单,在这里你可以看到目前Llamaindex已经支持的LLM类型,下面我将使用QWen模型实现一个入门案例。

  1. 安装相关依赖
# 引入灵积平台依赖
!pip install llama-index-llms-dashscope --quiet
# 加载环境变量
!pip install python-dotenv --quiet
  1. 初始化模型Client对象
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels
from dotenv import load_dotenv# 加载环境变量
load_dotenv()dashscope_llm = DashScope(model_name=DashScopeGenerationModels.QWEN_TURBO,max_tokens=1000,enable_search=False,temperature=0.2
)

关于如何使用dotenv,可以参考文章《揭秘python-dotenv:那些鲜为人知的实用窍门》

  1. 构建complete回话
# 同步输出
resp = dashscope_llm.complete("你好!")
print(resp)
  1. 构建stream会话
# 流式输出
responses = dashscope_llm.stream_complete("你好!")
for response in responses:print(response.delta, end="")
  1. 构建Chat会话
# chat 模型会话
from llama_index.core.base.llms.types import MessageRole, ChatMessagemessages = [ChatMessage(role=MessageRole.SYSTEM, content="你是一个AI智能机器人"),ChatMessage(role=MessageRole.USER, content="你好。"),
]
resp = dashscope_llm.chat(messages)
print(resp)
  1. 构建多轮会话
# 多轮对话
messages = [ChatMessage(role=MessageRole.SYSTEM, content="你是一个AI智能机器人"),ChatMessage(role=MessageRole.USER, content="你好。"),
]
# first round
resp = dashscope_llm.chat(messages)
print(resp)# add response to messages.
messages.append(ChatMessage(role=MessageRole.ASSISTANT, content=resp.message.content)
)messages.append(ChatMessage(role=MessageRole.USER, content="如何制作一个蛋糕?")
)
# second round
resp = dashscope_llm.chat(messages)
print(resp)

LLamaindex 设置Prompt

在LLamaindex中使用Prompt就像创建格式字符串一样简单,

from llama_index.core import PromptTemplatetemplate = ("我提供的上下文内容如下: \n""---------------------\n""{context_str}""\n---------------------\n""基于给出的内容,回答一下问题: {query_str}\n"
)
qa_template = PromptTemplate(template)context_str = """
重达3000吨、总长超70米、20层楼高度,又一“大国重器”成功问世!此“重器”的诞生也标志我国自研冲破西方“壁垒”。
据悉,这个形状酷似“茅台“的国器是目前世界上最大的加氢反应器,其在石油工业中的地位“媲美芯片”。
不少西方国家对于此项技术给出高价,但我们表示:100%中国制造,永不出售!
"""
query_str = "总结一下加氢反应器?"
# you can create text prompt (for completion API)
prompt = qa_template.format(context_str=context_str, query_str=query_str)
print(prompt)
# or easily convert to message prompts (for chat API)
messages = qa_template.format_messages(context_str=context_str, query_str=query_str)
print(messages)

除此之外你还可以定义Chat格式的Prompt

from llama_index.core import ChatPromptTemplate
from llama_index.core.llms import ChatMessage, MessageRolemessage_templates = [ChatMessage(content="You are an expert system.", role=MessageRole.SYSTEM),ChatMessage(content="Generate a short story about {topic}",role=MessageRole.USER,),
]
chat_template = ChatPromptTemplate(message_templates=message_templates)# you can create message prompts (for chat API)
messages = chat_template.format_messages(topic="狼来了")
print(messages)
# or easily convert to text prompt (for completion API)
prompt = chat_template.format(topic="狼来了")
print(prompt)

Llamaindex 支持 Embedding

Embedding是一种将离散数据映射到连续空间的表示方法。在自然语言处理中,Embedding技术可以将单词、句子等文本数据转化为低维向量,从而捕捉文本的语义信息。

在LlamaIndex中,嵌入用于将文本数据映射到语义空间,使得相似的文本在向量空间中靠近。这种表示方式对于语义搜索、文本分类和信息检索等任务至关重要。通过嵌入,LlamaIndex能够理解和处理文本的细微差异,从而提供更精准和个性化的服务。

LlamaIndex利用Embedding技术实现文本向量的生成,具体步骤如下:

(1)预处理:对文本进行清洗、切块等处理。

(2)构建Embedding模型:使用预训练的Embedding模型,如Word2Vec、BERT等,将文本转化为向量。

(3)向量存储与搜索:与LLM应用类似,将向量存储到向量数据库中,并进行相似度检索。

目前,LLamaindex已经支持了很多Embedding模型,你可以在这里查看,本次Embedding使用的是灵积平台中的Embedding模型。

  1. 文件内容Embedding
# imports
from llama_index.embeddings.dashscope import (DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType,
)# Create embeddings
# text_type=`document` to build index
embedder = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)text_to_embedding = ["风急天高猿啸哀", "渚清沙白鸟飞回", "无边落木萧萧下", "不尽长江滚滚来"]
# Call text Embedding
result_embeddings = embedder.get_text_embedding_batch(text_to_embedding)
# requests and embedding result index is correspond to.
for index, embedding in enumerate(result_embeddings):if embedding is None:  # if the correspondence request is embedding failed.print("The %s embedding failed." % text_to_embedding[index])else:print("Dimension of embeddings: %s" % len(embedding))print("Input: %s, embedding is: %s"% (text_to_embedding[index], embedding[:5]))
  1. 查询Embedding
# imports
from llama_index.embeddings.dashscope import (DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType,
)
# Create embeddings
# text_type=`query` to retrieve relevant context.
embedder = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_QUERY,  #指定对查询问题进行Embedding
)# Call text Embedding
embedding = embedder.get_text_embedding("骆驼祥子这本书讲了什么?")
print(f"Dimension of embeddings: {len(embedding)}")
print(embedding[:5])

后面的章节将会继续说明如何将向量化的内容存储到向量数据库中,以及如何对向量化结果进行Retrieval。

最后

本篇文章仅带着大家认识一下LLamaindex的LLM、Prompt以及Embedding相关功能,实际上你会发现LLamaindex的能力和Langchain是非常相似的,甚至LLamaindex可以和Langchain一起使用。

后面咱们会着重研究一下基于LLamaindex搭建使用RAG增强的ChatBot,以及相关的组件能力。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JavaEE】线程状态
  • Linux5:Shell编程——流程控制
  • 借助Aspose.html控件, 将SVG 转PNG 的 C# 图像处理库
  • JDK-java.nio包详解
  • 我出一道面试题,看看你能拿 3k 还是 30k!
  • 2024 年最值得阅读的 10 个外国技术网站
  • Linux网络-小结
  • mysql 分析慢查询
  • Opencv学习-图像翻转变换
  • SSM学生选课系统-计算机毕业设计源码99890
  • 中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题
  • <Qt> 常用控件
  • 使用labelme生成mask数据集(亲测可行)
  • 《学会 SpringMVC 系列 · 写入拦截器 ResponseBodyAdvice》
  • 《LeetCode热题100》---<5.③普通数组篇五道>
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 2019.2.20 c++ 知识梳理
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CentOS 7 修改主机名
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS字符串转数字方法总结
  • MySQL的数据类型
  • React16时代,该用什么姿势写 React ?
  • Shadow DOM 内部构造及如何构建独立组件
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 闭包--闭包之tab栏切换(四)
  • 闭包--闭包作用之保存(一)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 翻译:Hystrix - How To Use
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每天10道Java面试题,跟我走,offer有!
  • 前端相关框架总和
  • 手机端车牌号码键盘的vue组件
  • 系统认识JavaScript正则表达式
  • #Java第九次作业--输入输出流和文件操作
  • #Linux(make工具和makefile文件以及makefile语法)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (2)STM32单片机上位机
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .apk 成为历史!
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 版本不支持的问题
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net6使用WebSocket与前端进行通信
  • .NET处理HTTP请求
  • .NET单元测试使用AutoFixture按需填充的方法总结