
gte-base-zh低代码集成教程通过Streamlit快速搭建中文语义搜索演示应用你是不是经常遇到这样的问题面对海量的中文文档想快速找到相关内容却只能依赖关键词匹配结果要么搜不全要么搜不准。比如你想找“如何提高工作效率”的资料系统可能只会返回包含这几个字的文档而那些讲“时间管理”、“任务规划”、“高效方法”的文章就被漏掉了。这就是传统搜索的痛点——它不懂语义。今天我就带你用一个下午的时间手把手搭建一个能“理解”中文意思的智能搜索演示应用。我们不需要写复杂的后端代码也不用搭建繁琐的服务就用一个叫gte-base-zh的模型加上Streamlit这个神器快速搞出一个能用的demo。这个教程的目标很简单让你零基础也能跑起来一个语义搜索应用亲眼看到AI是怎么理解文本的。1. 准备工作认识我们的核心工具在动手之前我们先花几分钟搞清楚要用到的两个“法宝”是干什么的。放心我用大白话讲。1.1 gte-base-zh你的中文文本“理解官”你可以把gte-base-zh想象成一个非常擅长阅读中文的“专家”。它的核心能力是“文本嵌入”。什么是文本嵌入简单说就是把这个专家“读完”一段文字后的“读后感”用一串数字向量表示出来。如果两段文字意思相近那么它们对应的两串数字在数学上也会很接近。举个例子“今天天气真好”和“阳光明媚的一天”这两句话字面完全不同但意思很像。gte-base-zh给它们生成的数字串就会很相似。再比如“苹果手机”和“一种水果”虽然都有“苹果”但意思天差地别。gte-base-zh生成的数字串就会差别很大。这个模型由阿里巴巴达摩院训练专门针对中文优化过所以在处理我们的中文资料时效果会更好。它已经预置在环境里了地址是/usr/local/bin/AI-ModelScope/gte-base-zh。1.2 Streamlit让想法秒变网页的“魔术师”以前我们要做个带界面的应用得学前端HTML/CSS/JS、写后端Python/Java折腾半天。Streamlit把这个过程变得极其简单。它让你只用Python脚本就能生成一个交互式网页应用。你写几行代码定义一个输入框页面上就真的有个输入框你写一行代码显示数据页面上就真的有个表格或图表。对我们来说它的价值是我们可以专注于语义搜索的核心逻辑调用模型、计算相似度而把用户界面输入查询、展示结果这种“脏活累活”交给Streamlit自动搞定。这也就是“低代码”的魔力。1.3 Xinference模型的“服务生”模型本身是个静态的文件。我们需要一个“服务生”把它运行起来并提供一个标准的接口API供我们调用。Xinference就是干这个的。它已经帮我们启动了gte-base-zh模型服务。我们后续的Python代码只需要向这个服务发送请求说“嘿帮我把这段文字变成向量”它就会返回那串代表语义的数字。2. 环境检查与模型服务确认在开始写我们的应用之前先确保“服务生”已经就位模型可以正常工作了。2.1 确认模型服务已启动根据提供的资料模型服务是通过一个脚本启动的。我们可以查看日志来确认它是否启动成功。打开终端运行以下命令cat /root/workspace/model_server.log如果看到日志里有类似模型加载完成、服务监听在某个端口的成功信息就说明模型服务已经准备好了。如果第一次加载可能需要稍等几分钟。2.2 通过Web UI快速验证这是最直观的验证方法。根据提示我们可以通过Web界面直接测试模型。找到提供的Web UI入口并点击进入。在界面上你会看到输入文本的地方。你可以使用自带的示例文本或者自己输入两句话比如文本1:我喜欢吃苹果文本2:苹果是一种美味的水果点击“相似度比对”或类似的按钮。系统会计算并显示这两个文本的语义相似度得分通常是一个0到1之间的数越接近1表示越相似。如果你能看到一个具体的相似度分数例如0.85那就恭喜你最核心、最复杂的模型部分已经完全正常了。我们接下来的所有工作就是为这个强大的能力“包装”一个更友好、更实用的外壳。3. 搭建Streamlit语义搜索应用现在我们进入核心环节——编写应用代码。我会把代码分成几块并详细解释每一部分是做什么的。3.1 创建应用文件并安装依赖首先在你喜欢的工作目录下创建一个新的Python文件比如叫semantic_search_app.py。然后我们需要确保安装了必要的Python库。在终端执行pip install streamlit requests numpystreamlit: 用来构建网页应用。requests: 用来向我们的模型服务Xinference发送HTTP请求。numpy: 用来进行向量之间的数学计算计算相似度。3.2 编写完整的应用代码将下面的代码完整地复制到semantic_search_app.py文件中。代码中的注释会帮你理解每一步。import streamlit as st import requests import numpy as np from numpy.linalg import norm # ---------------------------- # 1. 应用基础设置 # ---------------------------- st.set_page_config(page_title中文语义搜索演示, layoutwide) st.title( 基于gte-base-zh的中文语义搜索演示) st.markdown( 欢迎使用这个应用可以帮你从一段文档集合中**根据意思**而不仅仅是关键词找到最相关的内容。 首先请在下方准备好你的文档库和查询问题。 ) # ---------------------------- # 2. 配置模型服务地址 # ---------------------------- # 这里填写你的Xinference模型服务地址 # 默认情况下如果按照之前描述部署地址和端口如下 MODEL_API_URL http://localhost:9997/v1/embeddings # 这是gte-base-zh模型在Xinference中的标识名通常可以在Web UI或日志里找到 # 如果不知道可以尝试用 gte 或查看Xinference的模型列表 MODEL_NAME gte-base-zh # ---------------------------- # 3. 核心函数获取文本的向量表示 # ---------------------------- def get_embedding(text): 调用Xinference服务将一段中文文本转换为语义向量。 参数: text: 要转换的文本字符串 返回: 一个numpy数组代表文本的向量 # 准备请求数据格式需要符合Xinference API的要求 payload { model: MODEL_NAME, input: text } try: # 发送POST请求到模型服务 response requests.post(MODEL_API_URL, jsonpayload) response.raise_for_status() # 如果请求失败如4xx, 5xx抛出异常 result response.json() # 从返回结果中提取向量数据 # Xinference返回格式通常是 {object:list,data:[{embedding:[...]}]} embedding_data result.get(data, []) if embedding_data and embedding in embedding_data[0]: vector np.array(embedding_data[0][embedding]) return vector else: st.error(f从API响应中解析向量失败: {result}) return None except requests.exceptions.ConnectionError: st.error(f无法连接到模型服务请确保Xinference服务已启动在 {MODEL_API_URL}) return None except requests.exceptions.RequestException as e: st.error(f请求模型服务时出错: {e}) return None except Exception as e: st.error(f处理过程中发生未知错误: {e}) return None # ---------------------------- # 4. 核心函数计算余弦相似度 # ---------------------------- def cosine_similarity(vec_a, vec_b): 计算两个向量之间的余弦相似度。 值范围在[-1, 1]之间越接近1表示越相似。 参数: vec_a, vec_b: 两个numpy向量 返回: 相似度分数 (float) # 避免除以零的情况 norm_a norm(vec_a) norm_b norm(vec_b) if norm_a 0 or norm_b 0: return 0.0 # 余弦相似度公式点积 / (模长的乘积) return np.dot(vec_a, vec_b) / (norm_a * norm_b) # ---------------------------- # 5. 构建Streamlit交互界面 # ---------------------------- st.header( 第一步准备文档库) # 使用文本区域让用户输入多个文档每行一个文档 doc_input st.text_area( 请输入你的文档库每行一个文档或段落:, height200, value机器学习是人工智能的一个分支。\n深度学习利用神经网络进行特征学习。\n今天北京的天气是晴天。\nPython是一种流行的编程语言。\n神经网络在图像识别中表现优异。 ) # 将输入的文本按行分割过滤掉空行形成文档列表 documents [doc.strip() for doc in doc_input.split(\n) if doc.strip()] st.info(f当前文档库共有 {len(documents)} 个文档。) st.header(❓ 第二步输入你的查询) # 用户输入查询问题 query st.text_input(你想搜索什么, value什么是人工智能) # ---------------------------- # 6. 执行搜索并展示结果 # ---------------------------- if st.button(开始语义搜索, typeprimary) and query: if not documents: st.warning(文档库是空的请先输入一些文档。) else: with st.spinner(正在计算语义向量请稍候...): # 获取查询问题的向量 query_vector get_embedding(query) if query_vector is None: st.stop() # 如果获取失败停止执行 # 为文档库中的每个文档获取向量 doc_vectors [] valid_docs [] # 使用进度条让用户感知计算过程 progress_bar st.progress(0) for i, doc in enumerate(documents): doc_vec get_embedding(doc) if doc_vec is not None: doc_vectors.append(doc_vec) valid_docs.append(doc) # 更新进度条 progress_bar.progress((i 1) / len(documents)) if not doc_vectors: st.error(未能成功获取任何文档的向量。) st.stop() # 计算查询与每个文档的相似度 similarities [] for doc_vec in doc_vectors: sim_score cosine_similarity(query_vector, doc_vec) similarities.append(sim_score) # 将文档和相似度分数配对并按分数从高到低排序 results list(zip(valid_docs, similarities)) results.sort(keylambda x: x[1], reverseTrue) # ---------------------------- # 7. 可视化展示搜索结果 # ---------------------------- st.header( 搜索结果) st.success(f针对查询 **{query}**按语义相关性排序如下) # 展示前5个最相关的结果 top_n min(5, len(results)) for i, (doc_text, score) in enumerate(results[:top_n]): # 用容器突出显示每个结果 with st.container(): col1, col2 st.columns([6, 1]) with col1: # 根据排名添加奖牌图标 rank_icon [, , , 4️⃣, 5️⃣][i] if i 5 else f{i1}. st.markdown(f**{rank_icon} 相关文档:** {doc_text}) with col2: # 用进度条样式直观显示相似度 st.metric(label相似度, valuef{score:.3f}) st.divider() # 添加分隔线 # 可选展示所有结果的条形图更直观 if len(results) 1: st.subheader(所有文档相似度分布) # 准备图表数据 chart_data { 文档: [f文档{i1} for i in range(len(results))], 相似度: [score for _, score in results] } st.bar_chart(chart_data, x文档, y相似度) # 提供原始数据下载可选 st.download_button( label下载完整结果数据CSV, dataf文档,相似度\n \n.join([f{doc},{score} for doc, score in results]), file_name语义搜索结果.csv, mimetext/csv )3.3 逐块理解代码如果你对代码不熟没关系我们过一遍关键部分导入与设置开头几行引入了我们需要的工具包并设置了网页的标题和介绍文字。配置地址MODEL_API_URL和MODEL_NAME是关键。这告诉我们的程序去哪里找那个“文本理解官”。你需要根据自己实际的Xinference服务地址和模型名称来修改这里。get_embedding函数这是灵魂函数。它把一段文字发送给我们之前启动的模型服务然后取回代表这段文字意思的“数字密码”向量。cosine_similarity函数这是比较函数。它用数学方法余弦公式计算两串“数字密码”有多像给出一个分数。交互界面st.text_area创建了输入文档库的大框st.text_input创建了输入查询的小框st.button创建了启动搜索的按钮。这就是Streamlit的魔力一行代码一个控件。搜索逻辑当用户点击按钮后程序会把用户的问题变成向量。把文档库里的每一段文字都变成向量。用“比较函数”计算问题向量和每一个文档向量的相似度。把所有文档按照相似度分数从高到低排队。结果展示用清晰的格式把排名前几的文档和它们的分数展示出来还用图表展示了所有文档的分数分布一目了然。4. 运行你的应用并开始搜索代码写好了运行它非常简单。在你的终端里确保当前目录下有semantic_search_app.py这个文件然后运行streamlit run semantic_search_app.py几秒钟后你的默认浏览器会自动打开一个新标签页地址是http://localhost:8501。恭喜你刚刚搭建的语义搜索应用界面就在眼前了。现在来玩转它吧使用默认数据直接点击“开始语义搜索”按钮看看系统如何从默认的文档库里找到和“什么是人工智能”最相关的句子应该是关于机器学习和深度学习的句子。自定义文档库清空文档库输入你自己的资料。比如你可以粘贴几段产品说明书、几篇技术博客摘要或者一些常见问题解答。提出你的问题在查询框里用自然语言提问。试试用同义词提问文档里有“神经网络”你问“深度学习模型”。用概括性语言提问文档里是具体的操作步骤你问“它的核心原理是什么”。观察结果看看返回的文档是不是真的和你的问题“意思上”接近而不是仅仅包含了相同的词语。5. 总结与进阶思考通过这个教程我们完成了几件很酷的事验证了模型通过Web UI确认了gte-base-zh模型工作正常。理解了原理知道了语义搜索的核心是把文字变成可计算的向量并通过比较向量来评估语义相似度。实现了应用用不到150行代码借助Streamlit快速搭建了一个功能完整、界面友好的演示应用。这个演示应用虽然简单但已经包含了语义搜索最核心的流程。你可以基于它做很多有趣的扩展接入真实数据把文档库从手动输入改为读取本地TXT、PDF文件或者连接数据库。优化性能文档很多时每次搜索都重新计算所有文档的向量太慢。可以事先把文档向量计算好存起来这个过程叫“索引”搜索时只计算问题的向量然后进行快速比对。尝试其他模型除了gte-base-zh还有很多优秀的文本嵌入模型如bge、m3e等可以在Xinference中尝试切换比较效果。打造完整产品加入用户管理、搜索历史、结果收藏等功能它就能变成一个真正的小工具。最重要的是你亲手体验了如何将前沿的AI模型能力通过低代码的方式快速转化为一个可交互、可感知的应用。这种“想法 → 原型”的快速验证能力在AI时代极其宝贵。希望这个教程能成为你探索AI应用开发的第一块积木。动手去修改代码加入你的想法看看这个语义搜索的“魔法”还能变出什么新花样。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。