快速构建企业智能门户,销售额倍增,人才触手可及 - 爬虫 + RAG + LLM

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: 本文介绍了一款基于大模型的智能企业门户接待系统,旨在通过先进的AI技术,实现企业网站信息的自动化处理与响应,提高客户支持、产品推荐和人才招聘的效率。系统利用爬虫技术自动提取公司官网信息,结合语音识别、大模型生成等技术,支持语音和文本输入,通过RAG(检索增强生成)方式生成精准回答,并支持语音播报,提供类似真人的接待体验。项目涵盖了环境准备、数据构建、代码实现、测试调优、部署等多个阶段,详细记录了开发过程中遇到的问题及解决方案,展示了系统在咨询公司信息、产品询问及招聘岗位咨询等场景下的应用潜力。未来计划在数据类型支持、会话记忆、并发处理、语音合成等方面进一步优化,以提升用户体验和服务质量。

 随着企业数字化转型的推进,智能化和高效服务成为企业竞争力的关键。我们设计了一款基于大模型的智能企业门户接待系统,利用先进的AI技术,只需粘贴您的门户主页便能自动构建智能虚拟接待员,帮助企业实现更高效的客户支持、产品推荐和人才招聘。这一系统不仅提高客户体验,还有效促进销售转化与人才获取。

一 背景介绍

  • 背景:大部分公司拥有复杂的门户网站,客户很难快速找到所需信息。因此,设计了基于爬虫、向量数据库、大模型和语音交互的智能接待系统。
  • 目标:让客户更轻松了解公司,提升用户体验,进而可能提升销售额和人才招聘效果。

二 技术架构

  • 使用爬虫+NLP模型自动提取公司官网的信息。
  • 核心技术包括大模型(如Llama 3.1)、语音识别(Whisper)和向量存储(FAISS)。
  • 客户可以通过语音或文本输入,系统通过RAG(检索增强生成)方式检索知识库并生成回复。

三 技术方案

3.1 技术选型

  • 图片内容提取:microsoft/phi-3-vision-128k-instruct
  • 选择原PHI-3 Vision 是一个强大的图像信息提取模型,能够从图片中生成高质量的文本描述。我们选择这一模型的原因是它具有高度的准确性和稳定性,尤其适用于企业场景中的图像描述提取。团队对这个模型较为熟悉,能够确保更快的开发与集成。
  • 语音转文本:Whisper - Medium Whisper 是一个开源的语音识别模型,在处理多种语言和口音的语音转文本任务上表现出色。我们选择 Medium 版本,主要是因为其体积适中,既能够应对常规场景,又不需要过高的计算资源,同时兼顾了性能和效率。
  • 向量化:NV-Embed-QA NV-Embed-QA 是英伟达提供的向量化模型,具备优越的兼容性和处理速度。由于系统需要处理大量文本数据并进行高效的向量化,NV-Embed-QA 的快速处理能力和与其他组件的无缝集成使其成为理想选择。
  • 核心大语言模型:Meta/Llama-3.1-405b-Instruct Llama 3.1 是 Meta 发布的开源大语言模型,具有最新的技术优势和卓越的性能表现。我们选择这个模型是因为它不仅开源可定制,还具备强大的生成与理解能力,能够很好地满足复杂企业场景中的对话需求。
  • 数据爬取:HTTP + BeautifulSoup HTTP 请求与 BeautifulSoup 是经典的网页数据抓取组合,能够高效、灵活地从公司网站中提取文本和图像信息。这个组合简单易用,开发成本低,且在处理结构化和半结构化数据方面表现良好。
  • 向量存储:FAISS FAISS 是由 Facebook 开发的开源向量搜索库,广泛应用于大规模向量检索。我们选择 FAISS 主要因为它处理高维向量数据的效率非常高,并且支持多种索引类型,能够根据实际需求灵活配置。
  • 语音转文字:Whisper (OpenAI-Whisper) Whisper 模型在多语种语音识别方面表现优异,特别适合需要高准确率和复杂语音处理的场景。选择 OpenAI-Whisper 是因为它具有强大的社区支持和持续更新的能力,保证了在未来可以获得更多的优化与增强。
  • 文字转语音:Pyttsx3 Pyttsx3 是一个离线的 Python 文本转语音库,具备跨平台的优势,能够在多种操作系统上稳定运行。选择 Pyttsx3 的原因是它的轻量级和高可定制性,使得在本地化应用中表现优异,特别是对于模拟真人语音的简单需求。

3.2 数据构建

  • 初始数据获取:
  • 目标:获取公司官网的所有页面及资源,构建企业知识库。
  • 实现方式:通过爬虫技术遍历公司官网的所有同域页面,收集页面上的文本、图片等资源。
  • 工具:使用 HTTP 和 BeautifulSoup 进行页面数据抓取和分类,确保获取的资源涵盖整个网站的公开内容。
  • 信息提取:
  • 文本信息提取:
  • 过程:从 HTML 页面中提取有意义的文本信息,过滤掉无内容的标记(如 <script>、<style>)以及其他非文本元素(如 <xml> 标记等)。
  • 关键点:确保提取的信息完整且准确,避免提取无关内容。
  • 图片资源提取:
  • 过程:将页面中的图片资源提交给图片信息提取模型(如 microsoft/phi-3-vision-128k-instruct),生成对应的文本描述。
  • 关键点:图片描述应尽可能精确,涵盖图片中与企业信息相关的核心内容。
  • 数据向量化:
  • 过程:将提取的文本信息/图片描述输入嵌入大模型(如 NV-Embed-QA),生成对应的向量表示。
  • 工具与模型:使用 NV-Embed-QA 模型进行高效的向量化处理,确保向量兼容性好且处理速度快。
  • 数据存储:
  • 存储方式:使用 FAISS 进行向量存储,构建本地知识库。
  • 过程:
  • 将所有生成的向量存入 FAISS 数据库中,并同时存储对应资源的网页地址(meta 信息)。
  • 数据校验与优化:
  • 校验过程:在数据存储完成后,进行向量检索的测试,确保构建的知识库能够高效、准确地返回查询结果。
  • 优化措施:根据初步测试的结果,对信息提取和向量化流程进行调优,确保在不同数据规模下系统性能稳定。

3.3 多模态整合

该智能接待系统通过多模态技术整合,实现了从用户输入到生成响应的完整闭环,为企业提供了智能、高效的客户服务体验。

  • 客户输入(语音+文本):
  • 系统支持语音和文本两种输入方式。对于语音输入,采用 Whisper 模型将语音转化为文本,为后续处理提供基础。这样,客户可以通过自然语言的方式与系统互动,提升用户体验。
  • RAG 搜索(检索增强生成):
  • 系统将客户输入的文本进行向量化处理,通过向量库快速匹配相关知识文档。这一过程利用预构建的知识库,通过检索找到最符合客户问题的多个文档,为生成精确回答提供依据。
  • 大模型生成:
  • 系统将客户输入与匹配到的相关文档构建成提示词,输入大模型进行推理。通过大模型的强大生成能力,系统能够根据上下文生成自然流畅且符合业务需求的回答。
  • 语音播报:
  • 最终生成的文本答案通过文字转语音技术(如 Pyttsx3)转化为语音输出,实现类似真人的解答效果,模拟企业接待场景。

四 实施步骤

4.1 环境准备

  • 安装miniconda ,创建 python3.8 环境
  • 下载ffmpeg 下载后配置好path,命令行输入ffmpeg -version不报错显示版本信息即可

4.2 环境搭建

  • 激活python3.8环境,配置加速源

 

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

image.gif

  • 安装python库:langchain-nvidia-ai-endpoints,jupyterlab,langchain==0.2.14, langchain_core,matplotlib,numpy,faiss,openai,langchain-community,gradio,pyttsx3,whisper, openai-whisper
  • 运行jupyter-lab,打开浏览器的jupyter notebook,新建一个notebook

4.3 代码实现

4.3.1 引入依赖测试安装正确性

from langchain_nvidia_ai_endpoints import ChatNVIDIA
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnableLambda
from langchain.schema.runnable.passthrough import RunnableAssign
from langchain_core.runnables import RunnableBranch
from langchain_core.runnables import RunnablePassthrough
 
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import os
import base64
import matplotlib.pyplot as plt
import numpy as np

image.gif

4.3.2 配置NIM模型的访问key

步骤是访问NIM网站,注册会员获取免费额度,然后选择任意个模型,点击获取APIkey即可

os.environ["NVIDIA_API_KEY"] = "nvapi-xxx"

image.gif

4.3.3 网页链接爬虫实现:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
// 这里可以修改你想爬取的最大连接数量,如果笔记本性能比较差,不建议太大值
MAX_PAGES = 500
def crawl_website(start_url, max_pages=100):
    start_host = urlparse(start_url).netloc  # Extract the host part of the start URL
    visited = set()
    queue = [start_url]
    results = [start_url]
    with open('links.txt', 'w') as file:  # Open file for writing
        while queue and len(results) < max_pages:
            current_url = queue.pop(0)
            if current_url in visited:
                continue
            try:
                response = requests.get(current_url, timeout=10)
                if response.status_code == 200:
                    visited.add(current_url)
                    results.append(current_url)
                    print('add url@' +  current_url)
                    file.write(current_url + '\n')  # Write the current URL to the file
                    soup = BeautifulSoup(response.text, 'html.parser')
                    # Find all links and add to the queue
                    for link in soup.find_all('a', href=True):
                        absolute_link = urljoin(current_url, link['href'])
                        if absolute_link not in visited and absolute_link not in results and urlparse(absolute_link).netloc == start_host:
                            queue.append(absolute_link)
            except requests.RequestException:
                continue
    return results
def read_links_file(filepath='links.txt'):
    with open(filepath, 'r') as file:
        return [line.strip() for line in file]

image.gif

4.3.4 读取链接

从已爬取完成的links.txt读取或者执行链接爬取, 修改门户网站链接

import os
# 替换下面的 URL 为网站首页
start_url = "https://www.abc.com"
if os.path.exists('links.txt'):
    found_pages = read_links_file()
    print("Read links from file")
else:
    print("File not found. Starting crawl...")
    found_pages = crawl_website(start_url)
    print("Crawled pages:")
# 去重
found_pages = set(url.strip('/') for url in found_pages)
found_pages = list(found_pages)
print(found_pages)

image.gif

4.3.5 内容提取

图片则由大模型生成描述,否则仅提取文本内容:

import re
from typing import List, Union
import base64
import requests
from bs4 import BeautifulSoup
def html_document_loader(url: Union[str, bytes]) -> str:
    """
    Loads the HTML content of a document from a given URL and return it's content.
    Args:
        url: The URL of the document.
    Returns:
        The content of the document.
    Raises:
        Exception: If there is an error while making the HTTP request.
    """
    try:
        response = requests.get(url)
        content_type = response.headers.get('Content-Type', '')
        if 'image' in content_type:
            image_b64 = base64.b64encode(response.content).decode('utf-8')
            chart_reading = ChatNVIDIA(model="microsoft/phi-3-vision-128k-instruct")
            result = chart_reading.invoke( f'生成下图的中文描述, : <img src="data:image/png;base64,{image_b64}" />')
            return result.content
        html_content = response.text
    except Exception as e:
        print(f"Failed to load {url} due to exception {e}")
        return ""
    try:
        # 创建Beautiful Soup对象用来解析html
        soup = BeautifulSoup(html_content, "html.parser")
        # 删除脚本和样式标签
        for script in soup(["script", "style"]):
            script.extract()
        # 从 HTML 文档中获取纯文本
        text = soup.get_text()
        # 去除空格换行符
        text = re.sub("\s+", " ", text).strip()
        return text
    except Exception as e:
        print(f"Exception {e} while loading document")
        return ""

image.gif

4.3.6 文本嵌入实现方法

from langchain.text_splitter import RecursiveCharacterTextSplitter
# text_splitter = CharacterTextSplitter(chunk_size=400, separator=" ")
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=400,
    chunk_overlap=0,
    length_function=len,
)
def create_embeddings(embedding_path: str = "./embed"):
    embedding_path = "./embed"
    print(f"Storing embeddings to {embedding_path}")
    urls =  found_pages
    for url in urls:
        print('load url@' + url)
        document = html_document_loader(url)
        texts = text_splitter.create_documents([document])
        try:
            index_docs(url, text_splitter, texts, embedding_path)
        except Exception as e:
            print("Generated embedding fail")
            print(e)
        else:
            print("Generated embedding successfully")

image.gif

4.3.7 存储嵌入向量

from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
from langchain.vectorstores import FAISS
def clean_text(text):
    # 移除无用的换行符和多余空格
    return text.replace("\\n", " ").strip()
embeddings = NVIDIAEmbeddings(model="NV-Embed-QA")
def index_docs(url: Union[str, bytes], splitter, documents: List[str], dest_embed_dir) -> None:
    """
    Split the document into chunks and create embeddings for the document
    Args:
        url: Source url for the document.
        splitter: Splitter used to split the document
        documents: list of documents whose embeddings needs to be created
        dest_embed_dir: destination directory for embeddings
    Returns:
        None
    """
    docs = []
    metadatas = []
    for document in documents:
        texts = splitter.split_text(document.page_content)
        docs.extend(texts)
        metadatas.extend([{"source":url}] * len(texts))
    
    docs = [clean_text(text) for text in docs]
    
    try:
        # Attempt to load an existing index if it exists
        store = FAISS.load_local(folder_path=dest_embed_dir, embeddings=embeddings, allow_dangerous_deserialization=True)
    except:
        # If the index doesn't exist, create a new one
        store = FAISS.from_texts(docs, embeddings, metadatas=metadatas)
    else:
        store.add_texts(docs, metadatas=metadatas)
    store.save_local(folder_path=dest_embed_dir)

image.gif

4.3.8 执行嵌入

--- 只需要执行一次构建向量库

# 只需要执行一次的
create_embeddings()

image.gif

4.3.9 RAG实现

from langchain.chains.conversational_retrieval.prompts import CONDENSE_QUESTION_PROMPT, QA_PROMPT
from langchain.chains import ConversationalRetrievalChain, LLMChain
from langchain.chains.question_answering import load_qa_chain
llm = ChatNVIDIA(model="meta/llama-3.1-405b-instruct", temperature=0.8, max_tokens=1000, top_p=1.0)
embedding_path = "embed/"
docsearch = FAISS.load_local(folder_path=embedding_path, embeddings=embeddings, allow_dangerous_deserialization=True)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
question_generator = CONDENSE_QUESTION_PROMPT | llm
chat = ChatNVIDIA(model="meta/llama-3.1-405b-instruct", temperature=0.1, max_tokens=1000, top_p=1.0)
doc_chain = load_qa_chain(chat , chain_type="stuff", prompt=QA_PROMPT)
retriever = docsearch.as_retriever()
# helper function 用于Debug
def print_and_return(x):
    print(x)
    return x
def welcome( user_input, ):
    doc_chain = load_qa_chain(chat , chain_type="stuff", prompt=QA_PROMPT)
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "Answer solely based on the following context:\n<Documents>\n{context}\n</Documents>, 禁止透漏你是从文档中获取的信息,必须以一名公司接待人员的口吻回答.必须用中文回答",
            ),
            ("user", "{question}"),
        ]
    )
    
    chain = (
        {"context": retriever, "question": RunnablePassthrough()}
        | RunnableLambda(print_and_return)
        | prompt
        | RunnableLambda(print_and_return)
        | llm
        | StrOutputParser()
    )
    rag_result = chain.invoke(user_input)
    return rag_result

image.gif

4.3.10 测试RAG

# answer = welcome('介绍下公司')
# print(answer)

image.gif

4.3.11 文字转语音实现方法

import pyttsx3
import os
def tts_function(text):
    # 使用 pyttsx3 将文本转为语音并保存为音频文件
    engine = pyttsx3.init()
    audio_file = "output.mp3"
    engine.save_to_file(text, audio_file)
    engine.runAndWait()
    return audio_file
def play_tts(text):
    audio_path = tts_function(text)
    return audio_path

image.gif

4.3.12 测试转语音效果

# path = play_tts(answer)
# print(path)

image.gif

4.3.13 根据文字输入调用rag再输出语音的包装方法

def audioRole(user_input,):
    llmAnswer = welcome(user_input)
    return play_tts(llmAnswer)

image.gif

4.3.14 根据录音文件地址读取并转为文本的方法

import gradio as gr
import whisper
# 加载 Whisper 模型
model = whisper.load_model("small")
def transcribe_audio(audio):
    # 使用 Whisper 模型进行语音转文字
    result = model.transcribe(audio)
    return result["text"]

image.gif

4.3.15 语音或文本输入 -> RAG -> 语音输出流程的包装方法

def audioOrText(source,user_input):
    print(user_input,source)
    if source is not None:
        user_input = transcribe_audio(source)
    print(user_input)
    if len(user_input):
       return audioRole(user_input)

image.gif

4.3.16 gradio界面配置

import gradio as gr
multi_modal_chart_agent = gr.Interface(fn=audioOrText,
                    inputs=[gr.Audio(sources=['microphone'], type="filepath"), 'text'], #gr.Image(label="Upload image", type="filepath"),
                    outputs=['audio'],
                    title="Multi Modal chat agent",
                    description="Multi Modal chat agent",
                    allow_flagging="never")
multi_modal_chart_agent.launch(debug=True, share=False, show_api=False, server_port=5000, server_name="0.0.0.0")

image.gif

4.4 测试和调优

  • 利用4.3.10 测试rag效果,利用4.3.12测试转语音的效果
  • 分别测试 “介绍下公司的产品”“我擅长xxxx,有适合我的岗位吗?"等输入情况下的输出
  • 调优:
  • 一开始可能会为了节省额度,使用比较小的模型,这部分可以慢慢的调大,够用即可
  • prompt需要根据实际情况进行适当的调整,这个真的很重要

4.5 部署

如果根据4.3的步骤,创建了完整的notebook,依次运行即可。最后gradio的代码运行后,使用浏览器访问:localhost:5000,即可开始体验和自己的虚拟接待员对话了。

五 使用场景和界面展示

5.1 使用场景

  • 咨询公司信息与联系方式:客户首次接触公司网站,想快速了解公司的基本信息、历史、联系方式等。通过智能接待系统,客户可以直接询问“你们公司在哪?”或“如何联系销售部门?”等问题,系统会根据官网数据快速检索并生成答案,以语音或文本形式即时回复。
  • 询问公司的销售产品:客户有明确的购买需求,但不清楚公司产品的详细信息。通过智能接待系统,客户可以咨询“你们有哪些产品?”、“这款产品有哪些功能?”等问题,系统会基于企业产品介绍页面中的内容进行检索,并提供精准的产品信息介绍。
  • 咨询招聘岗位信息:求职者希望了解公司当前的招聘信息及岗位要求。智能接待系统支持求职者提问如“你们公司现在招什么职位?”、“这个岗位的要求是什么?”等问题,系统会从招聘页面提取相关信息并生成回答,帮助求职者快速了解符合自己期望的职位。

5.2 原型界面展示

界面部分,上正式环境还是可以适当的调整一下:

  • 左侧为录音界面,右侧为语音响应的播放界面

image.gif 编辑

六 遇到的问题和解决记录

  • 向量嵌入失败(报错400):
  • 问题描述:在进行向量化处理时,系统出现了嵌入失败的错误(HTTP 400 Bad Request)。这个问题通常是由输入数据格式不正确或分词处理不当引起的。
  • 解决措施:分析后发现是由于文本分割过程中分词处理不佳,导致输入文本过长或不符合模型要求。为此,采用了 RecursiveCharacterTextSplitter 替代原本的 CharacterTextSplitter,通过递归的方式更灵活地分割文本,使得嵌入过程更加稳定和符合规范。
  • 语音解析不准确:
  • 问题描述:在部分嘈杂或音质较差的环境中,系统的语音识别效果不理想,导致转录结果与实际内容偏差较大。
  • 解决措施:为提高语音识别的准确性,决定更换更大、更复杂的语音转文本模型。更大的模型通常具备更强的泛化能力和对多噪音环境的鲁棒性,能够更准确地解析复杂语音。
  • 语音转文字报错找不到文件:
  • 问题描述:在进行语音转文本的过程中,系统频繁报错找不到必要的依赖文件,特别是在处理 Whisper 模型时。
  • 解决措施:Whisper 模型依赖于 FFmpeg 工具进行音频处理。分析后发现问题出在缺少 FFmpeg。通过安装 FFmpeg 并正确配置路径后,确保 Whisper 模型能够顺利加载和使用音频文件,解决了文件找不到的问题。

七 总结和展望

7.1 项目评估:

本项目虽然起步较晚,但在实践中证明了其具有广阔的应用前景。通过多次迭代测试,在理想环境下(如较好的收音条件下),系统能够快速且准确地给出客户所需的答案,回答与实际需求的偏差较小。然而,系统在实际运行中仍然面临一些挑战:

  • 语音转文字效果:在嘈杂环境或音质较差的情况下,语音识别的准确度存在下降,噪声过滤能力有待提升。
  • 语音输出情感欠缺:虽然系统的语音输出清晰,但缺乏情感表达,无法模拟更为自然的真人对话效果。

7.2 未来方向:

为进一步提升系统的性能与用户体验,未来的优化方向主要包括以下几方面:

  1. 数据爬取支持更多资源类型:在现有文本和图片提取基础上,增加对视频、PDF 等多种资源的支持,丰富知识库的内容和形式,使系统能够更全面地回答用户问题。
  2. 会话记忆支持:引入会话记忆功能,允许系统在多轮对话中保持上下文关联,使得交互更加自然、连贯。
  3. 并发支持优化:针对高并发环境进行优化,提高系统在多用户同时访问时的响应速度和稳定性,确保在峰值流量下的服务质量。
  4. 语音输出的拟人化:进一步优化语音合成技术,使输出语音更富有情感和自然性,模拟更加贴近真人的表达方式。
  5. 自动语音检测与提交:改进录音机制,使系统能够自动检测并处理客户的语音输入,无需用户手动按下录音按钮,从而提供更顺畅的交互体验。

八、参考资料

[1]、基础环境配置教程

[2]、langchain文档


九、看工作

作者正在找对应的大模型应用开发、产品研发类的工作,偏应用侧的,微调等也可以

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
506 2
|
2月前
|
人工智能 自然语言处理 数据库
基于RAG和LLM的水利知识问答系统研究
随着全球水资源紧张加剧,我国面临严峻的水资源管理挑战。《十四五规划》提出构建智慧水利体系,通过科技手段提升水情测报和智能调度能力。基于大语言模型(LLM)的水利智能问答系统,利用自然语言处理技术,提供高效、准确的水利信息查询和决策支持,助力水资源管理智能化。该系统通过RAG技术和Agent功能,实现了对水利知识的深度理解和精准回答,适用于水利知识科普、水务治理建议及灾害应急决策等多个场景,推动了水利行业的信息化和智能化发展。
|
2月前
|
人工智能 自然语言处理 前端开发
基于RAG和LLM的水利知识大语言模型系统开发有感
在数字化时代,水利行业的智能化管理尤为重要。本文介绍了基于大语言模型(LLM)和检索增强生成(RAG)技术的水利知识问答系统的开发过程。该系统结合了前沿AI技术和水利专业知识,通过构建全面的水利知识库,优化用户体验,确保系统的灵活性和可扩展性。项目展示了AI技术在垂直领域的巨大潜力,为水利行业的智能化发展贡献力量。
|
2月前
|
机器学习/深度学习 数据采集 人工智能
文档智能 & RAG 让AI大模型更懂业务 —— 阿里云LLM知识库解决方案评测
随着数字化转型的深入,企业对文档管理和知识提取的需求日益增长。阿里云推出的文档智能 & RAG(Retrieval-Augmented Generation)解决方案,通过高效的内容清洗、向量化处理、精准的问答召回和灵活的Prompt设计,帮助企业构建强大的LLM知识库,显著提升企业级文档管理的效率和准确性。
|
3天前
|
开发框架 人工智能 安全
Promptic:轻量级 LLM 应用开发框架,提供完善的底层功能,使开发者更专注于构建上层功能
Promptic 是一个轻量级的 LLM 应用开发框架,支持通过一行代码切换不同的 LLM 服务提供商。它提供了类型安全的输出、流式支持、内置对话记忆、错误处理和重试等功能,帮助开发者专注于构建功能,而不是底层的复杂性。
30 6
Promptic:轻量级 LLM 应用开发框架,提供完善的底层功能,使开发者更专注于构建上层功能
|
1天前
|
弹性计算 自然语言处理 数据库
通过阿里云Milvus和LangChain快速构建LLM问答系统
本文介绍如何通过整合阿里云Milvus、阿里云DashScope Embedding模型与阿里云PAI(EAS)模型服务,构建一个由LLM(大型语言模型)驱动的问题解答应用,并着重演示了如何搭建基于这些技术的RAG对话系统。
20 3
|
17天前
|
自然语言处理 算法
RAG真能提升LLM推理能力?人大最新研究:数据有噪声,RAG性能不升反降
随着大型语言模型(LLM)在自然语言处理领域的广泛应用,检索增强生成(RAG)技术因能引入新知识和减少幻觉而受到关注。然而,RAG对LLM推理能力的实际提升效果仍存争议。中国人民大学的一项研究表明,RAG虽能辅助LLM推理,但在处理含噪信息和深度推理时面临挑战。为此,研究团队提出了DPrompt tuning方法,旨在解决噪声问题并提升RAG性能。
43 12
|
19天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
1月前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
107 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
2月前
|
存储 人工智能 算法
精通RAG架构:从0到1,基于LLM+RAG构建生产级企业知识库
为了帮助更多人掌握大模型技术,尼恩和他的团队编写了《LLM大模型学习圣经》系列文档,包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构,基于LLM+RAG构建生产级企业知识库》和《从0到1吃透大模型的顶级架构》。这些文档不仅系统地讲解了大模型的核心技术,还提供了实战案例和配套视频,帮助读者快速上手。
精通RAG架构:从0到1,基于LLM+RAG构建生产级企业知识库