Cogito 3B开源大模型教程:基于Ollama API构建企业内部RAG问答系统
Cogito 3B开源大模型教程:基于Ollama API构建企业内部RAG问答系统
1. 引言:为什么选择Cogito 3B构建企业知识库?
想象一下这个场景:公司新来的同事想了解三年前某个项目的技术选型细节,或者销售团队需要快速查找某个产品的历史报价文档。传统的做法是去翻找共享文件夹、询问老员工,或者在海量邮件里搜索,效率低下且信息可能不准确。
这就是企业内部知识管理的痛点——信息分散、检索困难、新人上手慢。而今天我要介绍的解决方案,就是用Cogito 3B这个开源大模型,结合Ollama的便捷部署,快速搭建一个智能的企业内部问答系统。
Cogito v1预览版是Deep Cogito推出的混合推理模型,别看它只有3B参数,但在大多数标准测试中,表现都超过了同规模的其他开源模型,包括大家熟悉的LLaMA、DeepSeek和Qwen。它最大的特点是支持“自我反思”的推理模式,就像人在回答问题前会先思考一下,这让它的回答更加准确和可靠。
更重要的是,它完全开源,允许商业使用,支持128k的超长上下文,还能理解30多种语言。对于企业来说,这意味着你可以用很低的成本,搭建一个专属的智能知识助手。
接下来的教程,我会手把手带你完成从模型部署到系统搭建的全过程,即使你之前没接触过大模型,也能跟着一步步做出来。
2. 环境准备:快速部署Cogito 3B模型
2.1 理解我们的技术栈
在开始动手之前,我们先简单了解一下要用到的几个核心组件:
- Cogito 3B模型:这是我们的大脑,负责理解和生成答案。它的3B参数规模意味着对硬件要求不高,普通服务器甚至高性能个人电脑就能跑起来。
- Ollama:这是一个专门用来本地运行大模型的工具,它把复杂的模型部署过程变得极其简单,就像安装一个普通软件一样。
- RAG架构:这是整个系统的核心思想。RAG的全称是检索增强生成,简单说就是“先查资料,再回答问题”。系统会先从你的知识库里找到相关文档,然后把文档和问题一起交给模型,让模型基于这些资料来回答。
这样的组合有什么好处呢?模型本身的知识可能有限或者过时,但结合了你公司的最新文档,它就能给出准确、可靠的答案。
2.2 通过Ollama一键部署Cogito
现在我们来实际部署模型。如果你已经安装过Ollama,这个过程会非常简单。
首先打开Ollama,你会看到模型管理界面。在顶部找到模型选择入口,点击进入模型库。
在搜索框里输入“cogito”,你会看到几个版本。我们选择【cogito:3b】这个版本,这就是我们要用的Cogito 3B模型。
点击下载,Ollama会自动完成模型的下载和部署。这个过程可能需要一些时间,取决于你的网络速度,模型大小在2GB左右。
下载完成后,回到Ollama主界面,你就能在可用模型列表里看到cogito:3b了。选择它,然后在下面的输入框里简单测试一下:
你好,请介绍一下你自己。
如果模型能正常回复,说明部署成功了。你可以多问几个问题,感受一下这个模型的对话能力。
2.3 验证模型的基础能力
在构建复杂系统之前,我们先确认模型的基本功能是否正常。打开命令行,用Ollama的API测试一下:
# 测试模型是否能正常响应
curl http://localhost:11434/api/generate -d '{
"model": "cogito:3b",
"prompt": "用一句话解释什么是人工智能",
"stream": false
}'
你应该能看到一个JSON格式的响应,里面包含模型生成的答案。如果一切正常,我们就可以进入下一步了。
3. 构建企业知识库:文档处理与向量化
3.1 准备你的企业文档
知识库的质量直接决定了问答系统的效果。你可以从这些地方收集文档:
- 公司内部的Wiki、Confluence页面
- 产品说明书、技术白皮书
- 项目文档、设计文档
- 培训材料、操作手册
- 会议纪要、决策文档
建议先从一个小范围开始,比如某个部门的文档,或者某个产品的全套资料。这样调试起来更快,效果也更容易评估。
文档格式方面,支持得比较好的有:
- 纯文本文件(.txt)
- Markdown文件(.md)
- PDF文档
- Word文档(.docx)
- PowerPoint(.pptx)
我会用Python代码示例,但如果你更熟悉其他语言,思路是一样的。
3.2 文档加载与文本分割
我们需要先把各种格式的文档转换成纯文本,然后切成适合处理的小段。这里我用Python的langchain库来演示:
import os
from langchain.document_loaders import DirectoryLoader, TextLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 设置文档目录
documents_path = "./企业文档/"
# 加载所有文档
def load_documents():
documents = []
# 加载PDF文件
pdf_loader = DirectoryLoader(
documents_path,
glob="**/*.pdf",
loader_cls=PyPDFLoader
)
documents.extend(pdf_loader.load())
# 加载文本文件
text_loader = DirectoryLoader(
documents_path,
glob="**/*.txt",
loader_cls=TextLoader,
loader_kwargs={'encoding': 'utf-8'}
)
documents.extend(text_loader.load())
# 加载Markdown文件
md_loader = DirectoryLoader(
documents_path,
glob="**/*.md",
loader_cls=TextLoader,
loader_kwargs={'encoding': 'utf-8'}
)
documents.extend(md_loader.load())
print(f"共加载 {len(documents)} 个文档")
return documents
# 分割文本为小块
def split_documents(documents):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个块大约500字符
chunk_overlap=50, # 块之间重叠50字符,保持上下文连贯
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"文档被分割成 {len(chunks)} 个文本块")
return chunks
# 执行加载和分割
all_documents = load_documents()
text_chunks = split_documents(all_documents)
这段代码做了几件事:
- 从指定目录加载各种格式的文档
- 把每个文档分割成500字符左右的小块
- 块之间保留50字符的重叠,这样不会把完整的意思切断
为什么要把文档切碎?因为大模型一次能处理的文本长度有限,而且太长的文档检索效率低。切成小块后,我们只需要检索最相关的几个块,就能让模型基于这些信息来回答。
3.3 文本向量化与存储
文本向量化听起来很高大上,其实原理很简单:把文字转换成计算机能理解的数字(向量),这样计算机就能计算不同文本之间的相似度了。
我们使用开源的句子转换器(Sentence Transformers)来生成向量:
from sentence_transformers import SentenceTransformer
import numpy as np
import pickle
import os
# 初始化嵌入模型
embedding_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 生成所有文本块的向量
def create_embeddings(text_chunks):
print("开始生成文本向量...")
# 提取纯文本内容
texts = [chunk.page_content for chunk in text_chunks]
# 批量生成向量
embeddings = embedding_model.encode(
texts,
show_progress_bar=True,
batch_size=32
)
print(f"向量生成完成,形状:{embeddings.shape}")
return embeddings
# 保存向量和元数据
def save_vector_store(text_chunks, embeddings):
# 准备存储的数据
vector_store = {
'texts': [chunk.page_content for chunk in text_chunks],
'embeddings': embeddings,
'metadata': [chunk.metadata for chunk in text_chunks]
}
# 保存到文件
with open('vector_store.pkl', 'wb') as f:
pickle.dump(vector_store, f)
print("向量存储已保存到 vector_store.pkl")
# 也可以保存为numpy格式方便后续使用
np.save('embeddings.npy', embeddings)
return vector_store
# 执行向量化
embeddings = create_embeddings(text_chunks)
vector_store = save_vector_store(text_chunks, embeddings)
这里有几个关键点:
- 我们用了
paraphrase-multilingual-MiniLM-L12-v2这个模型,它支持多种语言,而且速度很快 - 批量处理文本,提高效率
- 把生成的向量保存下来,下次就不用重新计算了
向量化完成后,每个文本块都变成了一个384维的向量(这个维度由模型决定)。相似的文本会有相似的向量,这样我们就能用数学方法找到最相关的文档了。
4. 搭建RAG问答系统:检索与生成
4.1 实现语义检索功能
有了向量化的文档,现在我们需要实现检索功能——根据用户的问题,找到最相关的文档片段。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
class VectorSearch:
def __init__(self, vector_store_path='vector_store.pkl'):
# 加载之前保存的向量存储
with open(vector_store_path, 'rb') as f:
data = pickle.load(f)
self.texts = data['texts']
self.embeddings = data['embeddings']
self.metadata = data['metadata']
print(f"加载了 {len(self.texts)} 个文本块")
def search(self, query, top_k=5):
"""
根据查询检索最相关的文档
参数:
query: 用户的问题
top_k: 返回最相关的几个结果
"""
# 将查询转换为向量
query_embedding = embedding_model.encode([query])
# 计算查询向量与所有文档向量的相似度
similarities = cosine_similarity(query_embedding, self.embeddings)[0]
# 获取相似度最高的top_k个索引
top_indices = np.argsort(similarities)[-top_k:][::-1]
# 构建返回结果
results = []
for idx in top_indices:
result = {
'text': self.texts[idx],
'similarity': float(similarities[idx]),
'metadata': self.metadata[idx]
}
results.append(result)
return results
def print_results(self, results):
"""打印检索结果"""
print(f"\n找到 {len(results)} 个相关文档:")
for i, result in enumerate(results, 1):
print(f"\n{i}. 相似度:{result['similarity']:.3f}")
print(f"来源:{result['metadata'].get('source', '未知')}")
print(f"内容:{result['text'][:200]}...")
# 测试检索功能
search_engine = VectorSearch()
# 示例查询
query = "我们公司的请假流程是什么?"
results = search_engine.search(query, top_k=3)
search_engine.print_results(results)
这个检索器的工作原理是:
- 把用户的问题也转换成向量
- 计算问题向量和所有文档向量的相似度(用余弦相似度)
- 返回相似度最高的几个文档片段
你可以调整top_k参数来控制返回多少个相关文档。通常3-5个就足够了,太多反而会让模型困惑。
4.2 集成Cogito模型生成答案
现在到了最核心的部分:把检索到的文档和用户问题一起交给Cogito模型,让它生成最终答案。
我们需要通过Ollama的API来调用模型:
import requests
import json
class RAGQASystem:
def __init__(self, vector_search):
self.vector_search = vector_search
self.ollama_url = "http://localhost:11434/api/generate"
def build_prompt(self, query, context_docs):
"""
构建给模型的提示词
这是最关键的一步,好的提示词能让模型更好地利用上下文
"""
# 把检索到的文档拼接成上下文
context = "\n\n".join([doc['text'] for doc in context_docs])
prompt = f"""基于以下上下文信息,请回答用户的问题。
上下文信息:
{context}
用户问题:{query}
请根据上下文信息回答问题。如果上下文信息不足以回答问题,请如实说明你不知道。
回答:"""
return prompt
def generate_answer(self, query, top_k=3):
"""
完整的RAG流程:检索 + 生成
"""
# 1. 检索相关文档
context_docs = self.vector_search.search(query, top_k=top_k)
if not context_docs:
return "抱歉,我没有找到相关的信息来回答这个问题。"
# 2. 构建提示词
prompt = self.build_prompt(query, context_docs)
# 3. 调用Cogito模型生成答案
try:
response = requests.post(
self.ollama_url,
json={
"model": "cogito:3b",
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.3, # 较低的温度让回答更确定
"top_p": 0.9,
"num_predict": 500 # 最大生成长度
}
},
timeout=30
)
if response.status_code == 200:
result = response.json()
answer = result.get('response', '').strip()
# 4. 返回答案和参考来源
sources = [doc['metadata'].get('source', '未知文档')
for doc in context_docs]
return {
"answer": answer,
"sources": list(set(sources)), # 去重
"relevant_docs": [
{
"content": doc['text'][:150] + "...",
"similarity": doc['similarity']
} for doc in context_docs
]
}
else:
return f"模型调用失败,状态码:{response.status_code}"
except Exception as e:
return f"生成答案时出错:{str(e)}"
def ask(self, question):
"""简单的问答接口"""
print(f"\n用户问题:{question}")
print("-" * 50)
result = self.generate_answer(question)
if isinstance(result, dict):
print(f"\n答案:{result['answer']}")
print(f"\n参考来源:{', '.join(result['sources'])}")
# 显示相关文档片段
print("\n相关文档片段:")
for i, doc in enumerate(result['relevant_docs'], 1):
print(f"{i}. [相似度:{doc['similarity']:.3f}] {doc['content']}")
else:
print(f"\n{result}")
# 创建问答系统实例
qa_system = RAGQASystem(search_engine)
# 测试问答
test_questions = [
"我们公司今年的年假有多少天?",
"项目报销需要哪些材料?",
"技术部的晨会是每周几召开?"
]
for question in test_questions:
qa_system.ask(question)
print("\n" + "="*60 + "\n")
这段代码实现了完整的RAG流程:
- 用户提问
- 从知识库检索相关文档
- 把文档和问题组合成提示词
- 发送给Cogito模型生成答案
- 返回答案并显示参考来源
提示词的构建很关键,我用了比较清晰的格式告诉模型:“这是上下文,这是问题,请根据上下文回答”。这样模型就知道要基于提供的文档来回答,而不是依赖自己的知识。
5. 优化与部署:让系统更好用
5.1 提升问答质量的实用技巧
基本的RAG系统搭建好了,但你可能发现回答质量还有提升空间。这里分享几个实用的优化技巧:
技巧一:优化文本分割策略
之前我们用固定500字符分割,但这样可能会切断完整的句子或段落。可以改进为按语义分割:
from langchain.text_splitter import SentenceTransformersTokenTextSplitter
# 使用基于token的分割,更好地保持语义完整
semantic_splitter = SentenceTransformersTokenTextSplitter(
chunk_size=256, # token数量
chunk_overlap=20
)
# 或者按段落分割
def split_by_paragraph(text, min_chunk_size=100, max_chunk_size=500):
paragraphs = text.split('\n\n')
chunks = []
current_chunk = ""
for para in paragraphs:
para = para.strip()
if not para:
continue
if len(current_chunk) + len(para) <= max_chunk_size:
current_chunk += para + "\n\n"
else:
if current_chunk and len(current_chunk) >= min_chunk_size:
chunks.append(current_chunk.strip())
current_chunk = para + "\n\n"
if current_chunk and len(current_chunk) >= min_chunk_size:
chunks.append(current_chunk.strip())
return chunks
技巧二:改进检索策略
简单的向量检索可能不够精准,可以加入关键词检索作为补充:
import re
from collections import Counter
class HybridSearch:
def __init__(self, vector_search):
self.vector_search = vector_search
def extract_keywords(self, query, top_n=5):
"""从查询中提取关键词"""
# 移除停用词
stop_words = {'的', '了', '在', '是', '我', '有', '和', '就',
'不', '人', '都', '一', '一个', '上', '也', '很',
'到', '说', '要', '去', '你', '会', '着', '没有',
'看', '好', '自己', '这'}
words = re.findall(r'[\u4e00-\u9fff]+|[a-zA-Z]+', query.lower())
keywords = [word for word in words if word not in stop_words]
# 返回出现频率最高的词
word_counts = Counter(keywords)
return [word for word, _ in word_counts.most_common(top_n)]
def hybrid_search(self, query, top_k=5, vector_weight=0.7):
"""
混合检索:向量检索 + 关键词匹配
"""
# 向量检索结果
vector_results = self.vector_search.search(query, top_k=top_k*2)
# 提取关键词
keywords = self.extract_keywords(query)
# 关键词匹配评分
scored_results = []
for result in vector_results:
score = result['similarity'] * vector_weight
# 关键词匹配加分
text_lower = result['text'].lower()
keyword_score = sum(1 for kw in keywords if kw in text_lower)
score += (keyword_score / len(keywords)) * (1 - vector_weight)
scored_results.append({
**result,
'hybrid_score': score
})
# 按混合分数排序
scored_results.sort(key=lambda x: x['hybrid_score'], reverse=True)
return scored_results[:top_k]
技巧三:优化提示词模板
不同的任务可能需要不同的提示词。这里提供几个模板供参考:
class PromptTemplates:
@staticmethod
def general_qa(query, context):
"""通用问答模板"""
return f"""请根据以下信息回答问题。
相关信息:
{context}
问题:{query}
请基于上述信息提供准确、完整的回答。如果信息不足,请说明哪些方面缺乏信息。
回答:"""
@staticmethod
def technical_query(query, context):
"""技术问题模板"""
return f"""你是一个技术专家,请基于以下技术文档回答问题。
技术文档内容:
{context}
技术问题:{query}
请提供专业、准确的技术回答,可以包含步骤、原理或最佳实践。
技术回答:"""
@staticmethod
def policy_query(query, context):
"""政策流程查询模板"""
return f"""请根据公司政策文档回答以下流程相关问题。
政策文档:
{context}
员工问题:{query}
请清晰说明相关流程、要求、负责人和注意事项。如果涉及具体表单或系统,请注明。
流程说明:"""
5.2 构建Web界面与API服务
命令行用起来不够方便,我们可以搭建一个简单的Web界面。
先用Flask创建一个API服务:
from flask import Flask, request, jsonify, render_template_string
import os
app = Flask(__name__)
# 初始化问答系统(这里需要你之前定义的RAGQASystem)
# qa_system = RAGQASystem(vector_search)
HTML_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>企业知识问答系统</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.container { background: #f5f5f5; padding: 20px; border-radius: 10px; }
.question-input { width: 100%; padding: 10px; font-size: 16px; margin-bottom: 10px; }
.submit-btn { background: #007bff; color: white; border: none; padding: 10px 20px; cursor: pointer; }
.answer-box { background: white; padding: 15px; margin-top: 20px; border-radius: 5px; }
.sources { color: #666; font-size: 14px; margin-top: 10px; }
.loading { display: none; color: #007bff; }
</style>
</head>
<body>
<div class="container">
<h1>🤖 企业知识问答助手</h1>
<p>输入你的问题,系统会从企业知识库中查找相关信息并回答。</p>
<form id="qa-form">
<input type="text" class="question-input" id="question"
placeholder="例如:请假流程是什么?报销需要哪些材料?" required>
<button type="submit" class="submit-btn">提问</button>
</form>
<div id="loading" class="loading">正在思考中...</div>
<div id="answer-container"></div>
</div>
<script>
document.getElementById('qa-form').onsubmit = async function(e) {
e.preventDefault();
const question = document.getElementById('question').value;
const loading = document.getElementById('loading');
const answerContainer = document.getElementById('answer-container');
// 显示加载中
loading.style.display = 'block';
answerContainer.innerHTML = '';
try {
const response = await fetch('/api/ask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ question: question })
});
const data = await response.json();
// 显示答案
let html = `<div class="answer-box">
<h3>📝 答案:</h3>
<p>${data.answer.replace(/\n/g, '<br>')}</p>`;
if (data.sources && data.sources.length > 0) {
html += `<div class="sources">
<strong>📚 参考来源:</strong>${data.sources.join(', ')}
</div>`;
}
html += `</div>`;
answerContainer.innerHTML = html;
} catch (error) {
answerContainer.innerHTML = `<div class="answer-box" style="color: red;">
请求失败:${error.message}
</div>`;
} finally {
loading.style.display = 'none';
}
};
</script>
</body>
</html>
"""
@app.route('/')
def home():
return render_template_string(HTML_TEMPLATE)
@app.route('/api/ask', methods=['POST'])
def ask_question():
try:
data = request.json
question = data.get('question', '')
if not question:
return jsonify({'error': '问题不能为空'}), 400
# 这里调用你的问答系统
# result = qa_system.generate_answer(question)
# 暂时用模拟数据
result = {
'answer': '这是模拟回答。实际部署时需要连接真实的问答系统。',
'sources': ['员工手册.pdf', '财务制度.docx'],
'relevant_docs': []
}
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
运行这个Flask应用后,在浏览器打开http://localhost:5000就能看到一个简单的问答界面了。
5.3 系统监控与维护建议
系统上线后,还需要考虑监控和维护:
日志记录:
import logging
from datetime import datetime
class QALogger:
def __init__(self):
logging.basicConfig(
filename='qa_system.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
self.logger = logging.getLogger(__name__)
def log_question(self, question, answer, sources, response_time):
"""记录问答日志"""
log_entry = {
'timestamp': datetime.now().isoformat(),
'question': question,
'answer': answer[:200], # 只记录前200字符
'sources': sources,
'response_time': response_time
}
self.logger.info(f"QA Log: {log_entry}")
def log_error(self, error_msg, context):
"""记录错误日志"""
self.logger.error(f"Error: {error_msg}, Context: {context}")
# 在问答系统中集成日志
class EnhancedRAGQASystem(RAGQASystem):
def __init__(self, vector_search):
super().__init__(vector_search)
self.logger = QALogger()
def generate_answer_with_logging(self, query):
import time
start_time = time.time()
try:
result = self.generate_answer(query)
end_time = time.time()
if isinstance(result, dict):
self.logger.log_question(
query,
result['answer'],
result['sources'],
end_time - start_time
)
return result
except Exception as e:
self.logger.log_error(str(e), {'query': query})
raise
定期更新知识库:
def update_knowledge_base(documents_path, vector_store_path):
"""
定期更新知识库
可以设置定时任务,比如每周自动更新一次
"""
print("开始更新知识库...")
# 1. 加载新文档
new_documents = load_documents(documents_path)
# 2. 检查哪些文档有更新
# 这里可以根据文件修改时间来判断
# 3. 重新生成向量
text_chunks = split_documents(new_documents)
embeddings = create_embeddings(text_chunks)
# 4. 保存新的向量存储
save_vector_store(text_chunks, embeddings, vector_store_path)
print("知识库更新完成!")
6. 总结
6.1 回顾与收获
通过这个教程,我们完成了一个完整的企业内部RAG问答系统的搭建。让我们回顾一下关键步骤:
第一,我们了解了Cogito 3B这个优秀的开源模型,它在同等规模模型中表现出色,而且完全免费商用,非常适合企业场景。
第二,我们使用Ollama轻松部署了模型,避免了复杂的环境配置,让大模型的使用门槛大大降低。
第三,我们构建了企业知识库的处理流程,包括文档加载、文本分割、向量化存储,这是RAG系统的知识基础。
第四,我们实现了检索增强生成的完整流程,先检索相关文档,再让模型基于文档生成答案,这样既利用了模型的推理能力,又保证了信息的准确性。
第五,我们探讨了多种优化方法,从文本分割策略到混合检索,再到提示词优化,这些技巧能显著提升系统的实用性和准确性。
第六,我们搭建了Web界面和API服务,让非技术同事也能方便地使用这个系统。
6.2 实际应用建议
在实际部署时,我有几个建议:
从小范围开始:不要试图一次性导入公司所有文档。先从一个部门或一个项目开始,验证效果后再逐步扩大。
关注数据质量:知识库的质量比数量更重要。确保文档是准确的、最新的、结构清晰的。垃圾进,垃圾出,这个原则在这里同样适用。
设置使用规范:明确告诉员工这个系统能做什么、不能做什么。它可以回答基于文档的事实性问题,但不适合做创意发散或重大决策。
持续收集反馈:记录用户的问题和系统的回答,定期分析哪些问题回答得好,哪些回答得不好,然后针对性优化。
考虑权限控制:敏感文档可能需要权限控制,可以在检索阶段加入权限过滤,确保员工只能看到自己有权限的文档。
6.3 扩展思考
这个基础系统还有很多可以扩展的方向:
你可以加入多轮对话功能,让系统能记住之前的对话上下文。
可以集成到企业微信、钉钉等办公平台,让员工在工作群里就能直接提问。
可以加入反馈机制,让用户给回答打分,用这些反馈数据来持续优化系统。
还可以尝试用更小的模型专门做检索,用Cogito专门做生成,这样既能保证效果,又能提高响应速度。
最重要的是,这个系统会随着你们公司知识库的丰富而变得越来越聪明。它就像一个新员工,看得文档越多,成长得越快。
现在,你可以开始动手搭建自己的企业知识问答系统了。从收集第一批文档开始,一步步构建,你会看到它如何改变团队的信息获取方式。如果有问题,随时可以回顾这个教程,或者查阅相关文档。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐
所有评论(0)