1. 在Internstudio系统中创建一个开发机,选择CUde12.2-conda
2. 配置conda环境
3. 下载完相关包后,确认conda 的环境
4. 激活llamaindex环境后,系统提示符会从base转换成llamaindex
5. 安装 Llamaindex 和相关包, 用来实施RAG
经过漫长的等待,终于安装好了相关的包。
6. 继续配置和下载Sentence Transformer 这个embedding模型,用来对知识库内容进行向量化。
将如下内容写入到download.hf.py
运行程序开始下载Sentence Transformer
7. 下载NLTK库相关资源
执行如下代码:
8. 创建一段测试代码,作为baseline,用来测试没有开启RAG时候LLM的表现情况。
9. 尝试向LLM询问一个问题,"velscope的主要作用是什么?" 。 我们知道Velscope是一种用于检查口腔黏膜早期癌症病变筛查的仪器。
从LLM的反馈看,LLM产生了幻觉,把用于口腔黏膜癌症筛查的仪器,说成了检查牙齿表面裂纹的设备。
10. 下面开始尝试用RAG的方式来给LLM提供更新的知识内容。
先在llamaindex_demo目录下面创建一个data的子目录和一个velscope.md的文件,用来存储外来信息。
在vscode中,把我们已知的velscope.md的内容补全。
再创建一个llamaindex_RAG.py文件
内容如下:
import os
os.environ['NLTK_DATA'] = '/root/nltk_data'
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.settings import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.legacy.callbacks import CallbackManager
from llama_index.llms.openai_like import OpenAILike
# Create an instance of CallbackManager
callback_manager = CallbackManager()
api_base_url = "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
model = "internlm2.5-latest"
api_key = "请填写 API Key"
# api_base_url = "https://api.siliconflow.cn/v1"
# model = "internlm/internlm2_5-7b-chat"
# api_key = "请填写 API Key"
llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager)
#初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示
embed_model = HuggingFaceEmbedding(
#指定了一个预训练的sentence-transformer模型的路径
model_name="/root/model/sentence-transformer"
)
#将创建的嵌入模型赋值给全局设置的embed_model属性,
#这样在后续的索引构建过程中就会使用这个模型。
Settings.embed_model = embed_model
#初始化llm
Settings.llm = llm
#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
#创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。
# 此索引将文档转换为向量,并存储这些向量以便于快速检索。
index = VectorStoreIndex.from_documents(documents)
# 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。
query_engine = index.as_query_engine()
response = query_engine.query("xtuner是什么?")
print(response)
将代码中的问题修改为“velscope的主要作用是什么?" , 和baseline中向LLM提问的问题一致。
执行代码测试。结果说明LLM已经采纳了RAG的内容,并输出了正确的结果,而并没有出现幻觉,编造了一些非专业的信息,错误的把velscope设备识别成检查牙齿裂缝的仪器。
Baseline输出:
"VelScope是一种用于口腔检查的工具,主要作用是帮助牙医在治疗和诊断过程中更好地观察牙齿和牙龈的情况。它使用一种特殊的照明技术,可以照亮口腔中的细微结构,例如牙釉质、牙本质、牙骨质和牙髓腔等,使牙医能够更清晰地看到牙齿和牙龈的健康状况。
具体来说,VelScope可以:
1. **检查牙齿和牙龈的健康状况**:通过特殊的照明,VelScope可以帮助牙医更好地观察牙齿表面的微小裂缝、龋齿、磨损、牙齿颜色变化等,以及牙龈的炎症、出血、红肿等状况。
2. **早期发现口腔问题**:VelScope的照明技术可以揭示一些早期不易察觉的口腔问题,如龋齿的早期阶段、牙龈炎的早期迹象等,帮助牙医及时采取措施,防止问题恶化。
3. **指导治疗和预防**:VelScope提供的清晰图像可以帮助牙医制定更精确的治疗计划,同时也可以向患者展示口腔问题的实际情况,增强患者对口腔健康重要性的认识,促进预防性口腔保健。
4. **提高患者满意度**:通过清晰地展示口腔健康状况,VelScope可以帮助患者更好地理解自己的口腔问题,增加患者对治疗的信任和满意度。
总之,VelScope作为一种先进的口腔检查工具,极大地提高了口腔诊疗的准确性和效率,有助于维护和改善口腔健康。
RAG后输出:
"VelscopeVelscope的主要作用是利用荧光成像技术帮助检测口腔内的异常组织。通过蓝色光激发,正常组织会呈现绿色荧光,而异常组织如白斑、红斑、早期癌变等则显示为黑色或深色。这种荧光反应的差异有助于医生评估口腔健康,区分健康组织与异常组织。",
11. 测试web界面的Llamaindex web
安装依赖库,并创建一个app.py的程序
app.py的内容如下,并修改api_key.
import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.legacy.callbacks import CallbackManager
from llama_index.llms.openai_like import OpenAILike
# Create an instance of CallbackManager
callback_manager = CallbackManager()
api_base_url = "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
model = "internlm2.5-latest"
api_key = "请填写 API Key"
# api_base_url = "https://api.siliconflow.cn/v1"
# model = "internlm/internlm2_5-7b-chat"
# api_key = "请填写 API Key"
llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager)
st.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗")
st.title("llama_index_demo")
# 初始化模型
@st.cache_resource
def init_models():
embed_model = HuggingFaceEmbedding(
model_name="/root/model/paraphrase-multilingual-MiniLM-L12-v2"
)
Settings.embed_model = embed_model
#用初始化llm
Settings.llm = llm
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
return query_engine
# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:
st.session_state['query_engine'] = init_models()
def greet2(question):
response = st.session_state['query_engine'].query(question)
return response
# Store LLM generated responses
if "messages" not in st.session_state.keys():
st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]
# Display or clear chat messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
def clear_chat_history():
st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]
st.sidebar.button('Clear Chat History', on_click=clear_chat_history)
# Function for generating LLaMA2 response
def generate_llama_index_response(prompt_input):
return greet2(prompt_input)
# User-provided prompt
if prompt := st.chat_input():
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)
# Gegenerate_llama_index_response last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
response = generate_llama_index_response(prompt)
placeholder = st.empty()
placeholder.markdown(response)
message = {"role": "assistant", "content": response}
st.session_state.messages.append(message)
在服务器上运行这个app的服务
在本地IDE环境中做下端口映射
在浏览器中访问时候,发现出现错误。
发现是/model目录下面没有miniLM-L12-v2模型导致。安装这个模型:
git lfs install
git clone https://www.modelscope.cn/Ceceliachenen/paraphrase-multilingual-MiniLM-L12-v2.git
另外顺便吧git-lfs也安装下,在模型目录下pull
apt-get install git-lfs
git lfs install
git lfs pull
再次运行streamlit run app, 在本地浏览器下通过端口映射得到如下反馈。