天马AI使用检索增强生成导入背景设定的配置方法

文章导读
天马AI不会自动读取你本地的长篇设定。要在生成时引用人物传记或世界观细节,需要先把设定文档切成若干小段,生成向量后存入本地向量库,每次请求前检索最相关的几段,再拼进提示词。这就是检索增强生成(RAG)的通用流程,以下方法不依赖天马AI是否内置RAG功能,可以按你的实际接口调整。
📋 目录
  1. 将设定文档切分为适合检索的片段
  2. 用嵌入模型生成向量并写入本地数据库
  3. 编写检索函数返回最相关设定
  4. 把检索片段注入提示词并限制篇幅
A A

天马AI不会自动读取你本地的长篇设定。要在生成时引用人物传记或世界观细节,需要先把设定文档切成若干小段,生成向量后存入本地向量库,每次请求前检索最相关的几段,再拼进提示词。这就是检索增强生成(RAG)的通用流程,以下方法不依赖天马AI是否内置RAG功能,可以按你的实际接口调整。

适用场景:你有多份人物传记、世界观设定等长文档,希望天马AI生成内容时引用其中细节。操作动作:用Langchain切分TXT,用HuggingFace嵌入模型生成向量,存入ChromaDB,并写一个检索函数返回top_k片段,然后注入提示词。验证方式:打印检索到的片段,确认关键词命中。风险边界:注入长度受模型上下文限制,需要调整chunk_size和top_k,避免超出上下文或漏掉关键设定。

将设定文档切分为适合检索的片段

假设设定文档是TXT格式,整本直接拼进提示词会超出上下文,且向量检索效果差。所以切分是必要的。下面代码使用Langchain的RecursiveCharacterTextSplitter对文档切分:

from langchain.text_splitter import RecursiveCharacterTextSplitter

with open('setting.txt', 'r', encoding='utf-8') as f:
    text = f.read()

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=['\n\n', '\n', '。', '!', '?', ',', ' ', '']
)
chunks = splitter.split_text(text)
print('切分后片段数:', len(chunks))

chunk_size控制每个片段的字符数,设置太大会混入无关内容,太小容易切断一个完整事件。overlap让相邻片段保留重复上下文,避免关键设定恰好在切点上被分开。这里切为500字、重叠50字,是一个起步值,需根据实际文档和模型上下文调整。

天马AI使用检索增强生成导入背景设定的配置方法

用嵌入模型生成向量并写入本地数据库

切分后需要把每个片段转换为向量。这里使用HuggingFace的SentenceTransformer模型,配合ChromaDB做本地持久化存储:

from sentence_transformers import SentenceTransformer
import chromadb

model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
client = chromadb.PersistentClient(path='./setting_db')
collection = client.get_or_create_collection(name='setting_chunks')

for i, chunk in enumerate(chunks):
    embedding = model.encode(chunk).tolist()
    collection.add(
        ids=[str(i)],
        embeddings=[embedding],
        documents=[chunk]
    )

首次运行会下载模型,建议先确认网络。中文场景可以替换为shibing624/text2vec-base-chinese等模型,这里只演示通用流程。

天马AI使用检索增强生成导入背景设定的配置方法

编写检索函数返回最相关设定

检索函数用于根据用户输入找到最相关的设定。下面定义query_db,返回top_k个片段:

def query_db(query_text, top_k=3):
    query_embedding = model.encode(query_text).tolist()
    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=top_k
    )
    return results['documents'][0]

query = '主角在森林里遇到什么'
related_chunks = query_db(query)
for i, chunk in enumerate(related_chunks):
    print(f'片段{i+1}: {chunk[:100]}...')

这里top_k=3表示返回最相关的3个片段,实际使用时可以调整。验证检索效果最简单的方法是打印这些片段,并确认其中包含预期关键词。

天马AI使用检索增强生成导入背景设定的配置方法

把检索片段注入提示词并限制篇幅

检索到的片段需要注入提示词,同时控制输出长度。示例如下:

def build_prompt(query, top_k=3):
    related_chunks = query_db(query, top_k)
    context = '\n'.join(related_chunks)
    prompt = f'''请根据以下设定,回答用户问题。

参考设定如下:
{context}

用户问题:{query}

回答:'''
    return prompt

# 调用天马AI时,按你的实际接口传入prompt和max_tokens
prompt = build_prompt('主角在森林里遇到什么')
# response = your_tianma_api(prompt, max_tokens=500)

提示词模板中加入“参考设定如下:...”的分界,让模型明确区分设定和问题。max_tokens用于限制生成长度,例如设为500,避免输出过长。注入片段本身也占用上下文,如果chunk_size=500top_k=3,则约1500字符的设定,需要确认模型总上下文能容纳;否则减小top_kchunk_size